题目详情
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
题目来源:leetcode - 剑指offer2
做题思路
首先要知道题目让干什么,梳理题意:
1、已输入一个链表,要求输出第k个节点
2、返回的从k节点之后的链表
简述:就是找出从k节点到末尾之间的内容
解法1:快慢双指针
使用快慢双指针,快指针先走k步,然后快慢指针同时移动,这样当快指针走到末尾的时候,慢指针刚好停在k节点,快慢指针之间的内容就是要输出的结果。
解题步骤
//定义链表
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
//返回链表的倒数第k个节点,从k往后都要输出,使用快慢双指针,快指针先走k步,快指针到达
//尾部,慢指针刚好在第k个节点,返回这部分内容
ListNode fast = head; //定义快指针 ,指向链表的头节点,从头开始
ListNode slow = head; //定义慢指针
//先让快指针先走k步
for (int i = 0; i < k; i++) {
fast = fast.next;
}
//判断快指针是否走到末尾,如果没到末尾,快慢指针各走一步
while(fast != null){
fast = fast.next;
slow = slow.next;
}
//循环结束,快指针已到达最后一位,直接返回慢指针
return slow;
}
}
解法2: 顺序循环
常规思路:从第k个节点开始往后循环,如果这个链表长度为n,倒数的第k个节点则为 正数第 n-k+1 的节点。直接循环从 n-k+1节点 到 末尾即可;
解题步骤
找到n-k-i这个节点,直接返回
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int length =0; //链表长度
ListNode p = head; //定义指针,遍历链表
while (p != null){
length++;
p = p.next;
}
//开始遍历链表,先找到 n-k+1这个节点
int index = 1;
p = head;
while( p != null && index < length - k + 1){
index ++;
p = p.next;
}
//找到 n-k+1节点了,之后返回
return p;
}
}
相关标签:
- 链表
- 双指针
- 循环