劍指OFFER題14:輸入一個連結串列,輸出該連結串列中倒數第k個結點。
阿新 • • 發佈:2020-08-20
劍指OFFER題14:輸入一個連結串列,輸出該連結串列中倒數第k個結點。
分享一道比較常見的面試題的JAVA語言實現,題目來自劍指offer.
題目:
輸入一個連結串列,輸出該連結串列中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即連結串列的尾結點是倒數第1個結點。例如一個連結串列有6個結點,從頭結點開始它們的值依次是1、2、3、4、5、6。這個連結串列的倒數第3個結點是值為4的結點。
思路:
本題題意不難理解,輸出連結串列的倒數第k個結點.
這題首先想到的是連結串列取到最後一個結點在回頭K個,但是輸入的是一個單鏈表無法回頭,因此此思路受阻.
由這個的啟發我們可以採用雙指標的思想,讓兩個指標走,一個走完連結串列長度,一個走連結串列長度-K,第二個指標正好到倒數第K個位置上.
特殊情況處理,一是連結串列長度不一定大於K,因此需要判斷一下,小於K返回null.二是連結串列為空的情況.
JAVA程式碼如下:
package JianZhiOffer; //輸入一個連結串列,輸出該連結串列中倒數第k個結點。 public class FindKthNode { public static ListNode FindKthToTail(ListNode head, int k) { if(head == null){//結點為空 return null; } ListNode left = head; ListNode right= head;//定義左右雙結點同時在起點head處 //讓右節點先走K步 while(right.next != null && k>1){ right = right.next; k--; } //如果k不等於1說明連結串列長度不夠k,返回null if(k == 1){ //左右同時走直到右節點到末尾,此時左節點就指向了倒數第k個結點 while(right.next != null){ right= right.next; left = left.next; } }else{ return null; } return left; } //定義連結串列類 static class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } } //測試一下 public static void main(String[] args) { ListNode l1 = new ListNode(2); l1.next = new ListNode(3); l1.next.next = new ListNode(4); ListNode resNode = FindKthToTail(l1, 2); System.out.println(resNode.val); } }
ok~解決
實際上雙指標的思想對付連結串列問題有時候很有效也很好理解,應該多練習一下.