題目:鏈表中倒數第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;
}
}