剑指 Offer 22. 链表中倒数第k个节点
原题链接
题解
方式一:
最容易想到的是先遍历一遍链表求出链表的长度len, 倒数第k个节点(题目中说下表从1开始)就是顺序的len - k + 1个节点,然后再遍历一遍找到答案就行。
在本题中数据中的k好像没有超出链表长度的范围,所以不用判定就行了。如果题目中k有可能会超出范围,那么是需要特判的。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int res = 0;
ListNode p = head;
while(p != null){
res ++;
p = p.next;
}
int t = res - k;
while((t --) != 0){
head = head.next;
}
return head;
}
}
方式二
可以使用双指针的方式,定义一个指向链表头指针p,先让p走k步,那么剩下p到链表的最后还有len - k步,刚好是head走len - k步就可以到达len - k + 1个结点,所以两个指针一起前进就行了。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode p = head;
while((k --) != 0){
p = p.next;
}
while(p != null){
head = head.next;
p = p.next;
}
return head;
}
}
如有错误,欢迎指正!