給你乙個鍊錶,刪除鍊錶的倒數第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...