【LeetCode移除連結串列元素】
阿新 • • 發佈:2020-12-24
題目
刪除連結串列中給出定值val的所有節點
新增一個虛擬頭結點
我們的想法是從頭結點開始遍歷,一旦發現有和給定的val值相等的節點,將其刪除即可
但是因為連結串列的性質,我們想要刪除節點,就要找到該節點前一個和後一個節點
所以我們就判斷指標所指位置的下一個位置的值
如果這樣的話,頭節點就不能檢測了
所以我們新增一個虛擬頭結點,用來檢測頭結點
ListNode* removeElements(ListNode* head, int val) {
ListNode* virtualNode =new ListNode(val - 1);
virtualNode- >next = head;//虛擬頭結點
ListNode* p = virtualNode;
while (p->next != NULL) {
if (p->next->val == val) {
p->next = p->next->next;;
}
else {
p = p->next;
}
}
return virtualNode->next;//返回時不需返回虛擬頭結點
}
刪除頭結點的時候另作考慮
ListNode* removeElements(ListNode* head, int val) {
while (head != NULL && head->val == val) {
head = head->next;//後移一步
}
if (head == NULL) {
return head;
}
ListNode* p = head;
while (p->next != NULL) {
if (p->next->val == val) {
p->next = p->next->next;;
}
else {
p = p->next;
}
}
return head; //返回時不需返回虛擬頭結點
}
遞迴
ListNode* removeElements(ListNode* head, int val) {
if (head == NULL) {
return NULL;
}
head->next = removeElements(head->next, val);
if (head->val == val) {
return head->next;
}
else {
return head;
}
}