刪除鏈表中等於給定值 val 的所有節點。
示例
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
時間複雜度打敗了94%的人
空間複雜度打敗了64%的人
第一次做力扣的題呀,還有點小迷。說一下解題思路叭?
其實它向後遍歷鏈表,每次操作是相同的,我們就可以考慮用遞歸實現了。
1.老規矩,判斷輸入的鏈表頭節點值是否爲空,如果爲空,直接返回null或者頭節點都行。遞歸頭
2.傳入的結點是頭節點,並且頭結點就是所要刪除的結點時,返回null即可。遞歸頭
3.newHead.next != null。又可分爲兩種情況
- newHead.val == val。當前頭結點就是所要刪除的結點,直接返回頭節點的下一個結點。
- newHead.next.val == val。相當於當前的結點是所要刪除結點的前驅,此時你前驅已經找到,普通的鏈表刪除操作應該不用我說了叭。當前結點操作完,就確定它對應的next域就好了呀。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public static ListNode removeElements(ListNode head, int val) {
ListNode newHead = head;
if(newHead == null)
return newHead;
if(newHead.next == null && newHead.val == val){
return null;
}
if(newHead.next != null){
if(newHead.val == val){
return removeElements(newHead.next,val);
}
if(newHead.next.val == val){
ListNode toDelete = newHead.next;
newHead.next = toDelete.next;
toDelete.next = null;
}
newHead.next = removeElements(newHead.next,val);
}
return newHead;
}
}