剑指–链表中倒数第k个节点
1,题目:

2,思路:
方法一:双指针:
算法流程:
- 1.初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head 。
- 2.构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。
- 3.双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter 指向倒数第 k个节点)。
- 4.返回值: 返回 latter 即可。
方法二:普通想法:
进行两遍的循环。第一遍是找出链表的长度。第二遍是根据length-k来找出想要的结果节点。
3,代码:
方法一:双指针:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
//双指针
/*
算法流程:
1.初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head 。
2.构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。
3.双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter 指向倒数第 k个节点)。
4.返回值: 返回 latter 即可。
*/
ListNode former = head, latter = head;
for(int i = 0; i < k; i++)
former = former.next;//前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。
while(former != null) {
former = former.next;
latter = latter.next;//循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter 指向倒数第 k个节点)。
}
return latter;
}
}
方法二:普通想法:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
//普通想法
int length = 0;
ListNode p = head;
// 第一遍
while (p!=null){
length++;//找出链表的长度
p = p.next;
}
if (length<k) return null;
// 第二遍
p = head;
for (int i=0;i<length-k;i++){
p = p.next;//循环结束时,就是想要的结果
}
return p;
}
}
本文介绍两种寻找链表中倒数第K个节点的方法:双指针法和两次遍历法。双指针法通过初始化两个指针并保持一定距离,最终定位目标节点;两次遍历法则先获取链表长度,再计算目标节点位置。
285

被折叠的 条评论
为什么被折叠?



