1. 程式人生 > >15 連結串列中倒數第k個結點

15 連結串列中倒數第k個結點

先遍歷一遍連結串列,得到總的結點數,再找到倒數第k個幾點就對應數值即可。邊界條件為0.

收穫:當用一個指標遍歷連結串列的時候不能解決問題,那麼可以嘗試用兩個指標來遍歷連結串列,可以讓一個指標遍歷的速度快一些:比如一次在連結串列上走兩步或者讓它先在連結串列上走若干步。

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(k == 0)
            return null;
        int count = 0;
        ListNode p = head;
        while
(p != null){ p = p.next; count++; } int t = count - k; p = head; ListNode pre = null; while(p != null && t >= 0){ pre = p; p = p.next; t--; } return pre; } }

在寫程式碼的時候有個小錯誤:在第二個while迴圈體中沒有寫pre = p;

這個條件,直接返回的p,結果肯定是null啊!

2、上面的方法使用了兩次迴圈,如果要求使用一次遍歷就得到了結果!
使用快慢指標,開始的時候都指向頭結點,注意這裡的頭結點就是包含資料的第一個結點。然後讓快指標先移動一段距離,使得兩個指標的差距為k-1,即從當時的快指標位置向慢指標查第k個位置正好是慢指標。然後讓兩個指標一塊向後移動,當快指標指向最後一個元素的時候,慢指標指向的就是倒數第k個元素!利用的是兩指標之間的距離不變!程式碼如下:

public class Solution {
    public ListNode FindKthToTail(ListNode head,int
k) { ListNode fast = head; ListNode slow = head; if(head == null || k<=0){ return null; } for(int i=0;i<k-1;i++){ if(fast.next != null){ fast = fast.next; }else return null; } while(fast.next != null){ fast = fast.next; slow = slow.next; } return slow; } }

注意:
(1)當輸入連結串列頭指標為null的時候
(2)k==0的時候
(3)節點數小於k

本來想著連結串列倒序一下,直接輸出第k個,但是發現不對,因為結果帶著方向呢!比如說:{1,2,3,4,5},k=3,輸出的是{3,4,5},而不是結點值!
正好總結一下倒置連結串列的演算法:


 public void reverse(ListNode head,int k) {
        ListNode pre = null;
        while(head != null){
            ListNode t = head.next;//先儲存下一位的值
            head.next = pre;//指標逆轉
            pre = head;//先變換pre的值
            head = t;//後變換head的值
        }
}

相關推薦

劍指offer 15. 連結串列倒數k結點

原題 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 Reference Answer 解題思路: 對於這種python求解連結串列題,尤其是本題讓返回節點或者值,直接先遍歷玩連結串列轉換到 python 的list中,再進行操作,順風順水。 # -*- c

15 連結串列倒數k結點

先遍歷一遍連結串列,得到總的結點數,再找到倒數第k個幾點就對應數值即可。邊界條件為0. 收穫:當用一個指標遍歷連結串列的時候不能解決問題,那麼可以嘗試用兩個指標來遍歷連結串列,可以讓一個指標遍歷的速度快一些:比如一次在連結串列上走兩步或者讓它先在連結串列上走若

面試題15:查詢連結串列倒數k結點

1.題目:給定一個單鏈表,編寫函式,輸入一個連結串列,輸出連結串列中倒數第k個結點,其中倒數是從1開始計數,例如連結串列中的結點是1,2,3,4,5,6. 要查詢倒數第3個結點,會輸出4. 分析:比較傳統的做法就是,既然要查詢倒數k個結點,可以先編譯一遍連結串列,看連結串列

【劍指Offer學習】【面試題15連結串列倒數k結點

題目:輸入一個連結串列,輸出該連結串列中倒數第k 個結點.為了符合大多數人的習慣,本題從1 開始計數,即連結串列的尾結點是倒數第1 個結點.例如一個連結串列有6 個結點,從頭結點開始它們的值依次是1 、2、3、4、5 、6。這個個連結串列的倒數第3 個結點是值為

劍指offer22:連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。   class Solution: def FindKthToTail(self, head, k): # write code here if k<=0 or head

[劍指offer] --14.連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = v

連結串列倒數k結點 java

連結串列中倒數第k個結點 java 題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 解析: 最佳程式碼:Java程式碼,通過校驗。程式碼思路如下:兩個指標,先讓第一個指標和第二個指標都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點。然後兩個指標同時往後

【劍指Offer】12連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 時間限制:1秒;空間限制:32768K;本題知識點: 連結串列 解題思路 注意返回的是Node,而不是Node的Value。注意處理k超出範圍的異常情況。 # -*- coding:utf-8 -*- # class

14 連結串列倒數k結點

定義兩個指標start和end,讓start先走k步(在走的過程中,需要判斷start是否指向NULL,指向的話說明連結串列長度小於k,直接返回NULL),然後再判斷當前start是否指向NULL,指向的話說明量表長度等於k,直接返回end,否則令它們同時往後移動,當start到達連結串列末

劍指 Offer - 14:連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點 題目連結:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a public class Solution {

劍指offer刷題之連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 # -*- coding:utf-8 -*- # class ListNode: #     def __init__(self, x): #         s

劍指Offer14:連結串列倒數k結點

思路:  先判斷k是否小於1,若是則什麼都不返回。 反之,將head.val的值依次加入到列表l中,然後在判斷k是否大於l的長度,若是則什麼都不返回,反之返回l[-k]。 # -*- coding:utf-8 -*- # class ListNode: # def __

劍指offer-14:連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 思路 兩個指標,先讓第一個指標和第二個指標都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點。然後兩個指標同時往後移動,當第一個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點處。 程式碼

輸出單向連結串列倒數k結點/華為機試(C/C++)

題目描述 輸入一個單向連結串列,輸出該連結串列中倒數第k個結點,連結串列的倒數第1個結點為連結串列的尾指標。 連結串列結點定義如下: struct ListNode {       int  

劍指offer(14)連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 解題思路 輸出的是 倒數第k個連結串列,可以參考Leetcode刪除連結串列倒數節點的那個演算法題 一共有兩種解法,一是兩遍遍歷的,二是一遍遍歷的。 兩次遍歷的思路就是先遍歷一遍 求出連結串列長度,然後在遍歷,輸出N-k+1的節點

劍指offer刷題記錄14——連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 想到利用雙指標標記頭部,移動第二個指標直到距離為k - 1,再同時移動兩個指標,當第二個指標指向尾部,第一個指標則指向倒數第k個結點。 解法一: public class Solution {

劍指offer之連結串列倒數K結點

連結串列中倒數第K個結點 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 思路:使用兩個指標,先讓第一個指標和第二個指標都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點 然後兩個

劍指offer--連結串列倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 解析 可以先便利一遍求出連結串列總長,再遍歷第二遍求出結點。 或者定義兩個指標,一個先遍歷到第k個結點,再兩個一起往後遍歷,前一個為

【劍指offer{11-14}】二進位制1的個數、數值的整數次方、調整陣列順序使奇數位於偶數前面、連結串列倒數k結點

二進位制中1的個數、數值的整數次方、調整陣列順序使奇數位於偶數前面、連結串列中倒數第k個結點 二進位制中1的個數 題目描述 輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 C+

輸入一個連結串列,輸出該連結串列倒數k結點

兩種思路: 1)用棧的思想,先把連結串列反轉,然後再找出第k個節點。 先把所有節點放進棧內,同時統計節點個數,若總節點數小於k則返回null。在彈出棧,倒數k即為彈出的第k個值。 2)定義兩個指標,一個指標先走k步,再兩者一起往後走,當第一個指標到達終點的時候,第二個指