輸出單向鏈表中倒數第K個節點,好比咱們如今有int類型的1,2,3,4,5,6,7,8組成的一個單向鏈表,求倒數第三個元素。如圖所示:java
咱們正常的思路就是從後往前推倒數第K個元素,這裏有這樣幾個問題。首先是單向鏈表的限制,鏈表節點只有next指針指向下一個元素,因此咱們只能從前日後推;其次咱們須要知道最後一個元素後才能從後往前倒推,這裏就只能經過next指針由前日後遍歷,這是第一次循環,而後從後往前推又要開始遍歷,這是第二次循環;另外若是從後往前推這也是個問題;或者說第一次循環時知道了單項鍊表長度,而後經過倒數第K個,咱們能推導出是正數第幾個,這樣再從前日後循環一次就能獲取這個節點,可是這樣仍是循環了兩次。node
這裏咱們只介紹目前瞭解到的最優的解決方案,其餘方法就不一一介紹了。測試
咱們經過兩個指針和一次循環就能獲得想要的節點,步驟以下:this
咱們能夠按上圖中的鏈表來試算下。有 1,2,3,4,5,6,7,8這樣順序的一個單項鍊表,求倒數第3個節點。倒數第三個節點與最後一個節點的距離是3-1=2。先定義P1指針,從頭節點移動2步,到達節點3的位置停下來,這時定義P2節點指向頭節點,也就是節點1,而後P1和P2節點同時向後移動,當P1節點移動到最後一個節點8時,此時P1移動到了節點6處,而節點6就是倒數第3個節點,ok,節點6就是咱們要的節點。3d
代碼實現:指針
public class SingleLinkedNode { //節點上存儲的數據 private Object data; //該節點的下一個節點 private SingleLinkedNode next; public SingleLinkedNode(Object data){ this.data = data; } ...... }
public static SingleLinkedNode getReverseKPathNode(SingleLinkedNode head , int k){ //定義兩個指針P1和P2,這裏直接用節點表示 SingleLinkedNode P1 = head; SingleLinkedNode P2 = head; //P1移動到K-1位置停下來 for(int i=1;i<=k-1;i++){ P1=P1.getNext(); } //P1和P2同時向後移動,直到P1節點移動到最後一個節點 while(P1.getNext()!=null){ P1 = P1.getNext(); P2 = P2.getNext(); } //此時P2節點就是倒數第K個節點 return P2; }
測試:code
public static void main(String[] args){ SingleLinkedNode node1 = new SingleLinkedNode(1); SingleLinkedNode node2 = new SingleLinkedNode(2); SingleLinkedNode node3 = new SingleLinkedNode(3); SingleLinkedNode node4 = new SingleLinkedNode(4); SingleLinkedNode node5 = new SingleLinkedNode(5); SingleLinkedNode node6 = new SingleLinkedNode(6); SingleLinkedNode node7 = new SingleLinkedNode(7); SingleLinkedNode node8 = new SingleLinkedNode(8); node1.setNext(node2); node2.setNext(node3); node3.setNext(node4); node4.setNext(node5); node5.setNext(node6); node6.setNext(node7); node7.setNext(node8); System.out.println(getReverseKPathNode(node1,3).getData()); }
執行結果爲:6,。正確blog