1. 程式人生 > >連結串列例題2:連結串列的倒數第k個節點是多少

連結串列例題2:連結串列的倒數第k個節點是多少

解題思想:

1.建立一個結點類(為後面實現連結串列做基礎)

2.建立一個查詢倒數元素的方法

3.使用快慢指標的思想(主要的部分)

 

圖中的表示的是查詢倒數第k個結點的操作:

 

  建立一個快慢指標後pre(慢指標)指向的第一個結點,在通過k的具體數值來移動p1(快指標),讓它們之間包含k個結點(包括它們自身),然後不斷的將p1和pre向後移動,直到p1移動到最後一個結點的,此時pre所指的即為倒數第k個的結點。

 

程式碼如下:

 1 public class InquiryNode {
 2 
 3     public static
void main(String[] args) { 4 int arr[]= {1,2,3,4,5,6,7,8}; 5 Node head=new Node(); 6 //將陣列儲存資料用連結串列串起來 7 Node p=head; 8 for(int i=0;i<arr.length;i++) 9 { 10 p.next=new Node(arr[i]); 11 p=p.next; 12 } 13 14
System.out.println(Inquiry(head,5)); 15 16 } 17 18 //查詢倒數第K位結點值的方法 19 public static Object Inquiry(Node node,int k) 20 { 21 if(k<=0) 22 { 23 return null; 24 } 25 26 Node pre=node.next; //慢指標 27 Node p1=node.next; //
快指標 28 //拉開快慢指標的距離 29 int count=1; 30 while(p1!=null&&count<k) 31 { 32 p1=p1.next; 33 count++; 34 } 35 //如果k大於元素個數之和則為空 36 if(p1==null) 37 { 38 return null; 39 } 40 //將快指標移動到最後一位,同時慢指標也以相同的進度跟上 41 while(p1.next!=null) 42 { 43 pre=pre.next; 44 p1=p1.next; 45 } 46 //慢指標所指的就是倒數第K的元素 47 return pre.data; 48 } 49 50 } 51 52 //結點類 53 class Node{ 54 Object data; 55 Node next; 56 57 public Node() 58 { 59 60 } 61 public Node(int data) 62 { 63 this.data=data; 64 } 65 }

 

結果: