劍指 offer之鏈表中倒數第k個結點_Java

題目:鏈表中倒數第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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章