刪除鏈表中等於給定值 val 的全部節點。數據結構
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
遍歷鏈表,找出每一個待刪除節點的前一個節點。
特殊狀況:第一個節點就是待刪除節點時,要單獨操做。
注意點:當輸入爲:[1,1]時,按上面的思路刪除第一個節點,剩下的鏈表的頭節點又是待刪除節點。app
public ListNode removeElements(ListNode head, int val) { while(head != null && head.val == val){ ListNode pre = head; head = pre.next; pre.next = null; } if(head == null){ return null; } ListNode pre = head; while(pre.next!=null){ ListNode cur = pre.next; if(cur.val == val){ pre.next = cur.next; cur.next = null; }else{ pre = pre.next; } } return head; }
使用虛擬頭結點(統一頭節點和其餘節點的操做)簡化代碼:ide
private class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode removeElements(ListNode head, int val) { ListNode dummyHead = new ListNode(-1); dummyHead.next = head; ListNode pre = dummyHead; while(pre.next!=null){ ListNode del = pre.next; if(del.val == val){ pre.next = del.next; del.next = null; }else{ pre = pre.next; } } return dummyHead.next; }
注意:這裏返回時不能直接return head;函數
測試用例:測試
public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } // 鏈表節點的構造函數 // 使用arr爲參數,建立一個鏈表,當前的ListNode爲鏈表頭結點 public ListNode(int[] arr){ if(arr == null || arr.length == 0) throw new IllegalArgumentException("arr can not be empty"); this.val = arr[0]; ListNode cur = this; for(int i = 1 ; i < arr.length ; i ++){ cur.next = new ListNode(arr[i]); cur = cur.next; } } // 以當前節點爲頭結點的鏈表信息字符串 @Override public String toString(){ StringBuilder s = new StringBuilder(); ListNode cur = this; while(cur != null){ s.append(cur.val + "->"); cur = cur.next; } s.append("NULL"); return s.toString(); } }
public 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; } }
參考:《玩轉數據結構》ui