1. 程式人生 > 實用技巧 >力扣-203-移除連結串列元素

力扣-203-移除連結串列元素

方法一、不優化,特例判斷

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] -> [],針對於開頭一連串的val
if(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, int
val) { 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() } }

方法二、利用哨兵節點,進行特例判斷