劍指Offer 鏈表中倒數第k個結點
阿新 • • 發佈:2018-02-15
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個結點