剑指Offer--11.面试题22. 链表中倒数第k个节点
题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
方法一:简单遍历,获取长度并获得结果
分析:
- 首先先遍历链表, 获取链表的长度Count;
- 然后求倒数第K个节点。即是求正数len-k+1结点
代码:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode temp = head;
ListNode res = head;
int count=0;
while(temp!=null){
count++;
temp = temp.next;
}
int start = count - k + 1;
int flag = 0;
while(res!=null){
flag++;
if(start==flag){
break;
}
res = res.next;
}
return res;
}
}
方法二: 使用List容器
分析:
由于List容器有序且可重复。因此使用list容器遍历存储我们的链表,然后对应取出对应的元素。
代码:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
List<ListNode> list = new ArrayList<ListNode>();
while(head!=null){
list.add(head);
head = head.next;
}
return list.get(list.size()-k);
}
}
方法三: 双指针,快慢指针
代码:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode f = head;// 定义先走的指针
ListNode l = head;// 定义后走的指针
// 先让先走的指针先走k步(保证与后指针隔k步)
for(int i=0; i<k;i++){
f = f.next;
}
// 遍历,直到前指针为空、 此时后指针则为我们的结果
while(f!=null){
f = f.next;
l = l.next;
}
return l;
}
}