题目:链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路:
第一种方案:可以先统计链表的长度,然后让链表往前走sum-k步
第二种方案:定义两个指针,让快指针先走k-1步,再让慢指针往前走,快指针走到头,慢指针到达倒数第k个节点。
第一种方案:可以先统计链表的长度,然后让链表往前走sum-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){
return null;
}
//计算链表的总长度
int sum=0;
ListNode cur=head;
while(cur!=null){
sum++;
cur=cur.next;
}
if(sum<k){
return null;
}
if(sum==k){
return head;
}
//链表长度大于k
//让链表向前走sum-k个节点
cur=head;
for(int i=0;i<sum-k;i++){
cur=cur.next;
}
return cur;
}
}
第二种方案:定义两个指针,让快指针先走k-1步,再让慢指针往前走,快指针走到头,慢指针到达倒数第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;
}
//快指针向前走k-1步
ListNode fast=head;
for(int i=1;i<k;i++){
if(fast.next!=null){
fast=fast.next;
}else{
return null;
}
}
ListNode slow=head;
while(fast.next!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}
}