劍指Offer-14:輸入一個鏈表,輸出該鏈表中倒數第k個結點。


題目描述

輸入一個鏈表,輸出該鏈表中倒數第k個結點。例如有一個鏈表有六個節點1,2,3,4,5,6.則它的倒數第二個節點為5

節點定義如下:

public class ListNode {
int val;
ListNode next = null;
ListNode(
int val) { this.val = val; } }

思路一:

設置一個快指針,一個慢指針。像一把尺子,當尺子的一端移動到鏈表的末尾,則另一端則為倒數第k個節點。

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
       if(head==null||k<=0)
           return null;
        ListNode p,q;    //定義兩個快慢指針,制造一把尺子
        p=q=head;
        int i=0;
       for(;p!=null;i++){
           if(i>=k)
               q=q.next;
           p=p.next;
       }
        return i<k?null:q;
    }
}

思路二:

兩次遍歷。第一次遍歷出鏈表的長度n,第二次遍歷獲取鏈表第n-k+1個節點。

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
       if(head==null||k<=0)
           return null;
        //1.遍歷鏈表的長度
        int n=0;
        ListNode tempNode = head;
        while(tempNode!=null){
            n++;
            tempNode = tempNode.next;
        }
        if(k>n)
            return null;
        //2.遍歷獲取第n-k+1個節點
        for(int i=0;i<n-k;i++){
            head = head.next;
        }
        return head;
    }
}

思路三:

借助棧來存儲所有節點,在利用出棧獲取倒數第k個節點

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
       if(head==null||k<=0)
           return null;
        //1.借助棧來存儲節點
        Stack<ListNode> stack = new Stack<>();
        while(head!=null){
            stack.push(head);
            head=head.next;
        }
        //判斷k是否越界
        if(k>stack.size())
            return null;
        //2.出棧來獲取倒數第k個節點
        while(k>1){
            stack.pop();
            k--;
        }
        return stack.pop();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM