給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:給定的 n 保證是有效的。
高階:你能嘗試使用一趟掃瞄實現嗎?
兩次遍歷的演算法思路:
第一遍歷從頭結點開始來計算鍊錶的長度,然後根據鍊錶的長度和n的值來計算從頭節點開始移動到所需刪除節點的前乙個節點需要移動的次數,然後再用乙個新的指向頭結點的指標遍歷第二次,進行刪除操作
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
int del_len = len - n -1;
//從頭結點將指標移動到刪除節點的前乙個節點,所需要移動的次數
if(len == n)
while
(del_len--
) listnode* del_node = q-
>next;
q->next = del_node-
>next;
delete del_node;
return head;}}
;
在之前提交的過程中報錯:
runtime error: member access within null pointer of type 'struct listnode'
成員試圖訪問該型別的空指標,新增判斷條件
if
(len == n)
一次遍歷的演算法思路:
設定雙指標p和q,當p移動至最後乙個節點的next,即null指標時,如果q指標在p的前方第n個位置,此時q指標的下乙個就是我們需要刪除的節點指標。
建立乙個頭節點的前驅節點,使得p和q指標都指向該節點,先對p指標進行移動,向前移動n+1個位置,此時p和q之間就會相隔n個節點,再將p和q指標一起移動,當p指標指向null時,q指標的下乙個就是我們需要刪除的節點了。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
while
(p) listnode* del_node = q-
>next;
q->next = del_node-
>next;
delete del_node;
listnode* ret_node = before_node-
>next;
delete before_node;
return ret_node;}}
;
在之前提交的過程中報錯:
runtime error: member access within null pointer of type 'struct listnode'
該錯誤原因和之前的相同,在對p和q進行賦值初始化時,沒有使用head之前的節點before_node,而直接使用了head,導致在程式for迴圈中p = p->next處報出錯誤,因為在訪問p->next時,可能p處的節點已經為null了 LeetCode 19 鍊錶(160)
1 如圖,鍊錶是一種非常常用的資料結構 煉表頭 指向第乙個鍊錶結點的指標 鍊錶結點 鍊錶中的每乙個元素,包括 1 當前結點的資料,2 下乙個結點的位址 鍊錶尾 不再指向其他結點的結點,其位址部分放乙個null,表示鍊錶到此結束。2 鍊錶可以動態地建立 動態地申請記憶體空間 int pint new ...
鍊錶 LeetCode19刪除鍊錶中的第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?分析 看到這個問題,第一反應,先求長度,再找節點,看一下高階,有...
leetcode 19 分隔鍊錶
給定乙個頭結點為 root 的鍊錶,編寫乙個函式以將鍊錶分隔為 k 個連續的部分。每部分的長度應該盡可能的相等 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。這k個部分應該按照在鍊錶 現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。返回乙個符合上述規則的鍊錶...