給定乙個鍊錶,刪除鍊錶的倒數第 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,得出刪除節點的前...