刪除鍊錶的倒數第k個結點

2022-09-22 06:00:10 字數 1958 閱讀 8050

給你乙個鍊錶,刪除鍊錶的倒數第k個結點,並且返回鍊錶的頭結點。

示例 1:

輸入:head = [1,2,3,4,5], k = 2

輸出:[1,2,3,5]

示例 2:

輸入:head = [1], k = 1

輸出:

示例 3:

輸入:head = [1,2], k = 1

輸出:[1]

本題要求刪除倒數第k個結點,重要的是獲取刪除結點的前乙個結點,將該節點的下乙個結點指向要刪除的節點的下乙個結點,常規思路是遍歷鍊錶,獲得鍊錶長度,然後根據鍊錶長度找到要刪除的結點,這種方法需要遍歷兩次鍊錶。使用雙指標的方法可以做到一次遍歷就能夠找到結點。使用雙指標,乙個指標從頭開始乙個指標從第k個開始,然後兩個指標一起向後遍歷,當快指標到達鍊錶尾部的時候,慢指標對應的剛好是倒數第k+1個結點

解法:鍊錶遍歷、雙指標(一次遍歷)

**:

package test.linklist;

/** *

* @author foldn

* 從長度為n的鍊錶中,刪除倒數第k個結點

* */

public class deletekthnode

public static node deletekthnode(node head,int k)

// 方法一,直接遍歷鍊錶

// 記錄鍊錶的頭,因為最後要返回鍊錶的頭

node linkedlist = head;

while(linkedlist != null)

// 遍歷完煉表後,k有三種情況,分別是等於0,大於0,小於0

// k大於0,說明需要刪除的結點不存在於鍊錶中,不需要處理,直接返回鍊錶即可

// k等於0,說明要刪除的是鍊錶的頭節點

if(k == 0)

// k小於0,需要再次進行遍歷確定要刪除的結點

if(k < 0)

// 刪除結點

linkedlist.next = linkedlist.next.next;

} return head;

*/// 方法二,使用雙指標,只需要使用一次迴圈

if(k < 1 || head == null)

node fast = head;

node slow = head;

for(int i = 0;i < k; i++)

// 這一步是為了當刪除的結點是頭結點的時候,可以正常返回

if(fast == null)

while(fast.next != null)

slow.next = slow.next.next;

return head;

}}

**解析:

鍊錶遍歷相當簡單,就是先遍歷一般確定長度,然後通過長度確定要刪除的節點的前乙個結點,然後第二次遍歷找到要要刪除的結點的前乙個結點,對鍊錶進行更改

本題我們使用快慢雙指針對鍊錶進行遍歷,一遍遍歷即可確定要刪除的結點。首先讓快指標fast先向前移動k個位置,此時讓fast指標和slow指標一起向後遍歷,當fast指標遍歷完最後乙個節點(即此時的fast結點對應的是鍊錶最後乙個結點對應的next,為null)的時候,slow結點對應的結點就是要刪除的結點。為了簡便刪除對應結點,我們可以一開始建立乙個啞結點,將該節點的next設為head,這樣我們可以處理直接處理當要刪除的結點為頭節點的問題,並且找到的結點是要刪除的節點的下乙個結點

總結:快慢雙指標一般用於倒數的元素的處理或者檢測會回文序列

鍊錶刪除倒數第k結點

思想 快指標先走到第k個結點。然後快慢指標一起往後走,當快指標指向最後乙個結點的時候,慢指標就是倒數第k個結點 刪除倒數第k個結點 public static node deletelastkth node list,int k k過大,已經走到末尾了 if fast null return lis...

刪除鍊錶的倒數第k個結點

刪除鍊錶的倒數第k個結點 1看到題的想法是從頭到尾遍歷單鏈表,找到倒數第k的節點 這裡建立兩個指標即pre和head 分情況 plist鍊錶為空,返回空 先讓前指標從第乙個節點遍歷到第k個節點 k 此時k 1,後指標pre和前指標head剛好差k個結點 此時讓後指標開始從第乙個結點與前指標head同...

13 鍊錶倒數第K個結點

題目 輸入乙個單向鍊錶,輸出該鍊錶中倒數第k 個結點。鍊錶的倒數第0 個結點為鍊錶的尾指標。鍊錶結點定義如下 struct listnode handwriting listnode lastk listnode head,int k whlie knode 0 return head 1 沒考慮k...