力扣-203-移除連結串列元素
阿新 • • 發佈:2020-12-24
方法一、不優化,特例判斷
package LeetCode; /**返回連結串列的中間結點,如果有兩個中間節點,則返回第二個**/ //雙指標法:fast和slow,slow每次走一個單位,fast每次走兩個單位 public class day10 { //情況1:這個程式碼有點複雜,存在刪除頭節點和尾節點兩種情況 public ListNode removeElements1(ListNode head, int val) { if(head == null) return null; while(head.val == val){ //特例 [1,1,1,1] -> [],針對於開頭一連串的valif(head.next == null) return null; else head = head.next; } ListNode prev = head; ListNode node = head.next; while(node != null) { if(node.val == val) { prev.next = node.next; }else{ prev= node; } node = node.next; } return head; } }
package LeetCode; /**返回連結串列的中間結點,如果有兩個中間節點,則返回第二個**/ //雙指標法:fast和slow,slow每次走一個單位,fast每次走兩個單位 public class day10 { //情況2:優化,增加哨兵節點。使連結串列永不為空、永不無頭、簡化插入和刪除 public ListNode removeElements2(ListNode head, intval) { ListNode sentinelNode = new ListNode(0); sentinelNode.next = head; ListNode prev = sentinelNode, curr = head; while(curr != null) { if(curr.val == val) prev.next = curr.next; else prev = curr; curr = curr.next; } return sentinelNode.next; } public static void main(String[] args) { //test() } }
方法二、利用哨兵節點,進行特例判斷