1. 程式人生 > >劍指Offer 鏈表中倒數第k個結點

劍指Offer 鏈表中倒數第k個結點

n-k ont ava 復雜度 tps ng- 劍指offer views gpo

  題目描述:輸入一個鏈表,輸出該鏈表中倒數第k個結點。

  題目鏈接:鏈表中倒數第k個結點

  思路:指向首結點的第1個指針走k-1步,如果後繼結點為空,則返回null,第1個指針指向第k個結點。指向首結點的第2個指針與第1個指針同步遍歷,當第1個指針指向最後一個結點時,第2個指針走了n-k步,指向了倒數第k個結點(n-1-(n-k)=k-1,倒數第1個結點與倒數第k個結點相差k-1步)。

  步驟:

  1 如果首結點為空或者k<=0,返回null。

  2 指向首結點的第1個指針走k-1步。

  3 指向首結點的第2個指針與第1個指針同步遍歷,直到第1個指針指向最後一個結點。

  4 返回第2個指針指向的結點。

  時間復雜度:O(n)。

  Java代碼:

 1 /*
 2 public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }*/
10 public class Solution {
11     public ListNode FindKthToTail(ListNode head,int k) {
12         // 如果首結點為空或者k<=0,返回null
13         if
(head == null || k <= 0) { 14 return null; 15 } 16 17 // 第1個指針指向首結點 18 ListNode first = head; 19 // 走k-1步,第1個指針指向第k個結點 20 for (int i = 1; i < k; i++) { 21 // 後繼結點不能是null 22 if (first.next == null) { 23 return
null; 24 } 25 26 first = first.next; 27 } 28 29 // 第2個指針指向首結點 30 ListNode second = head; 31 // 當第1個指針指向最後一個結點時,第2個指針走了n-k步,指向了倒數第k個結點 32 // n-1-(n-k)=k-1 33 // 倒數第1個結點與倒數第k個結點相差k-1步 34 while (first.next != null) { 35 first = first.next; 36 second = second.next; 37 } 38 39 return second; 40 } 41 }

  

  參考資料

  [編程題]鏈表中倒數第k個結點

劍指Offer 鏈表中倒數第k個結點