每日演算法 刪除鍊錶的倒數第N個節點

2021-09-19 05:54:06 字數 1391 閱讀 7243

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

示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.

說明:給定的 n 保證是有效的。

高階:你能嘗試使用一趟掃瞄實現嗎?

一次掃瞄實現的意思是我們要在迴圈中想辦法尋找到倒數第n+1個節點,然後將他的next改掉;

既然題目給出了定長的空間,我們就要合理利用,使用片段移動的方式來確定倒數第n+1個節點;

public

class

demo03

//1.首先知道鍊錶刪除某元素是將上乙個元素的next指向該元素的next元素。(跳過該元素)

//2.那麼使用額外的list集合,在遍歷時將鍊錶元素新增,即可得得到倒數第n,n+1,n-1節點。

//將n+1賦值給n-1的next即可

return null;

}/**

* 上邊的方法採用了額外的集合來完成需求,增加了空間消耗

* 1.既然要移除倒數第n個元素,說明n是確定的,那麼如何能使得不借助「外力」在迴圈中找到倒數第n個元素呢;

* 2.可以使用移動片段的方法;

* 3.假設從倒數第n個元素到鍊錶末尾長度為l,那麼如果有乙個長度為l的片段左側從初始位置開始移動;

* 4.當該片段的右側到達鍊錶末尾,理論上此時的左側應該在倒數第n個元素處;

* 5.那麼依照此方式我們也可以找到第n-1個元素;

* @param head

* @param n

* @return

*/public

static listnode removenthfromend2

(listnode head,

int n)

//1.宣告乙個起始節點方便控制。

listnode listnode =

newlistnode(0

);listnode.next = head;

listnode first = listnode;

listnode end = listnode;

//先讓end元素往前移動n+1位

for(

int i =

1;i<=n+

1;i++

)while

(end!=null)

first.next = first.next.next;

return listnode.next;}}

class

listnode

}

讀題要認真,找出題中隱藏的條件;

培養自己的抽象思維,想法要獨特但不失理智;

盡可能的壓縮空間和時間,並在平時寫**的時候注意加以運用。

Leetcode之刪除鍊錶的倒數第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?雙指標,當遍歷指標前進n個時,後面乙個指標指向頭部,這樣保證了當...

演算法 刪除鍊錶的倒數第n個節點

題目 刪除鍊錶的倒數第n個節點 描述 給定乙個鍊錶,刪除鍊錶中倒數第n個節點,返回頭節點 example 輸入 1 2 3 4 5 null 2 輸出 1 2 3 5 null 輸入 1 null 1 輸出 null 這題最先想到的解法是,先通過快慢節點,算出該鍊錶的長度lenth,然後再迴圈一次,...

刪除鍊錶倒數第N個節點

1.問題 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.2.演算法 暴力破解法 先計算得出鍊錶的長度m,然後將鍊錶長度和所給倒數字置相減,即loc m n 1,得出刪除節點的前...