注:此博客不再更新,所有最新文章將發表在個人獨立博客limengting.site。分享技術,記錄生活,歡迎大家關注
題目描述
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
方法一:
思路:倒第k即正第size - k + 1,遍歷鏈表兩次,時間複雜度O(n)
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null || k <= 0) return null;
int size = 0;
ListNode cur = head;
while (cur != null) {
size ++;
cur = cur.next;
}
if (k > size) return null;
cur = head;
for (int i = 1; i != size - k + 1; i ++) {
cur = cur.next;
}
return cur;
}
}
方法二:
雙指針,先讓第一個指針和第二個指針都指向頭結點,然後再讓第一個指針走(k-1)步,到達第k個節點。然後兩個指針同時往後移動,當第一個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點了。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null || k <= 0) return null;
ListNode cur1 = head;
ListNode cur2 = head;
for (int i = 1; i != k; i ++) {
if (cur1.next != null) {
cur1 = cur1.next;
} else {
return null;
}
}
while (cur1.next != null) {
cur1 = cur1.next;
cur2 = cur2.next;
}
return cur2;
}
}