給定乙個鍊錶(單鏈表),刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。假設給定的n是有效的。
示例:
給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.演算法思想:進行兩趟掃瞄,第一趟掃瞄累加出鍊錶總長度,第二趟掃瞄迴圈次數為鍊錶長度-n。掃瞄完成後指標指向要刪除的節點的前驅節點。當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
**實現:
/**
* definition for singly-linked list.
* struct listnode ;
*/struct listnode*
removenthfromend
(struct listnode* head,
int n)
for(
int i=
0;i)//第二趟掃瞄
h = h->next;
if(h->next->next ==
null
)//當要刪除的節點為尾結點時,直接令h->next為null
h->next =
null
;else
h->next = h->next->next;
return head->next;
//返回煉表頭結點
}
演算法效能分析:
演算法思想:只進行一趟掃瞄,每次迴圈n的值不為零的話就減1,否則頭指標向後移一位。這樣當尾指標遍歷到尾結點時頭指標指向的就是要刪除節點的前驅節點。
**實現:
/**
* definition for singly-linked list.
* struct listnode ;
*/struct listnode*
removenthfromend
(struct listnode* head,
int n)if(
!h->next->next)
h->next =
null
;//當要刪除的節點為尾結點時,直接令h->next為null
else
h->next = h->next->next;
return head->next;
//返回煉表頭結點
}
演算法效能分析:
說明:不管哪個演算法,都動態生成了乙個新的節點並使其next指向頭結點,掃瞄前頭指標都指向此節點。
單趟遍歷時執行時間減半,且記憶體消耗並沒有增加,綜合效率提公升。
刪除鍊錶倒數第N個節點
1.問題 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.2.演算法 暴力破解法 先計算得出鍊錶的長度m,然後將鍊錶長度和所給倒數字置相減,即loc m n 1,得出刪除節點的前...
刪除鍊錶倒數第n個節點
leetcode 題目 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.note n 鍊錶長度時,刪除頭節點 n 0時,不做任何操作。當第乙個指標first 比第二個指標領先n步,然後...
刪除鍊錶的倒數第N個節點
與查詢鍊錶的倒數第n個節點對比只改動了一行 查到倒數第n個節點後,將該節點的後續指標p1.next p1.next.next 即可 package 鍊錶中 public class nthnodefromendoflist return m 刪除倒數第n個節點 param args public s...