題目描述
刪除鏈表中等於給定值val
的所有節點。
示例1:
輸入: head = [1, 2, 6, 3, 4, 5, 6], val = 6
輸出: [1, 2, 3, 4, 5]
思路分析
這道題目爲簡單程度,所以我們這裏給出簡單思路。
我們需要考慮一般規則,當刪除節點爲中間或非兩端節點時,直接令被刪節點的前置節點指針直接指向被刪節點後置節點即可,這裏我們可將核心代碼給出:
代碼1: 刪除節點的一般實現
// assume that "nodePrev -> node -> nodeNext":
// nodePrev.next = node;
// (node.val == val) = True
// remove node
nodePrev.next = node.next; // OR nodePrev.next = nodePrev.next.next;
邊界情況考慮
這裏需要考慮兩個邊界情況:
- 當鏈表頭節點滿足
head.val == val
時; - 當鏈表尾節點滿足
tail.val == val
時。
問題1:頭節點滿足刪除條件
這裏我們由代碼1可知,我們的操作依據主要是nodePrev
節點,但是頭節點沒有前置節點,這時候我們可以主動引入哨兵節點dummyHead
,直接令dummyHead.next = head
, 則一般規則就對**問題1 **依然適用。
問題2:尾節點滿足刪除條件
我們先通過代碼1進行簡單的分析,當尾節點要被刪除時,其後置節點爲null
, 此時將前置節點指向空指針nodePrev.next = null
; 並不影響代碼,所以這裏我們直接給出步驟及解題代碼:
解題步驟
- 初始化指針,一個爲遍歷指針
p
, 另一個爲哨兵節點dummyHead
; - 遍歷原始鏈表,並刪除指定節點;
- 返回結果
dummyHead.next
.
解題代碼
public static ListNode solution(ListNode head, int val) {
if (head == null) {
return null;
}
/* Step1: Init. pointers */
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode p = dummyHead;
/* Step2: go through the head-list
and
remove specified nodes with value of "val"
*/
while(p.next != null){
if(p.next.val == val){
p.next = p.next.next;
}else{
p = p.next;
}
}
/* Step3: return dummyHead's next-node */
return dummyHead.next;
}
複雜度分析
時間複雜度:我們對原始鏈表進行了一次遍歷,容易理解時間複雜度爲O(N)
;
空間複雜度:我們這裏沒有設置輔助容器,故空間複雜度爲O(1)
.
GitHub源碼
完整可運行文件請訪問GitHub。