LeetCode#203-Remove Linked List Elements-移除連結串列元素
阿新 • • 發佈:2020-04-11
一、題目
刪除連結串列中等於給定值 val
的所有節點。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
二、題解
- 解法1:哨兵節點。
初始化一個哨兵節點 solider
,並將其 next
指標指向連結串列的頭部;
初始化一個指標 prev
指向哨兵節點 solider
,作為前繼節點;
比較前繼節點的下一個節點和要刪除的節點,若下一個節點是要刪除的節點,則 prev->next = prev->prev->next
,反之則前繼節點移動到下一個節點,即 prev = prev->next
最後返回 solider->next
。
時間複雜度:O(n);空間複雜度:O(1)。
class ListNode { public $val = 0; public $next = null; function __construct($val) { $this->val = $val; } } /** * @param ListNode $head * @param Integer $val * @return ListNode */ function removeElements($head, $val) { $solider = new ListNode(null); $solider->next = $head; $prev = $solider; while ($prev->next!= null) { if ($prev->next->val == $val) { $prev->next = $prev->next->next; } else { $prev = $prev->next; } } return $solider->next; }
- 解法2:不設定哨兵節點(虛擬頭節點)
上面的解法是設定了一個虛擬頭節點,那如果不設定虛擬頭節點呢?
先判斷連結串列的頭節點是不是要刪除的值,如果是,則將頭節點向後移動,若移動完後頭節點為空,則說明該連結串列的所有節點均為要刪除的;
設定一個前繼節點 prev
,並指向頭節點,比較前繼節點的下一個節點的值和要刪除的值,若相等,則將前繼節點的下一個節點指向前繼節點下一個節點的下一個節點,反之則前繼節點向後移動;
最後返回 head
即可。
function removeElements($head, $val) {
//如果開頭就是要刪的元素,則將頭節點移動
while ($head->val == $val) {
$head = $head->next;
}
//如果連結串列全是要刪除的元素,則頭節點經過上述操作後為空
if ($head == null) {
return null;
}
$prev = $head;
while ($prev->next!= null) {
if ($prev->next->val == $val) {
$prev->next = $prev->next->next;
} else {
$prev = $prev->next;
}
}
return $head;
}