在算法题中链表的移除元素问题

我们直接看例题

203. 移除链表元素

移除其实很简单,只要掉过要移除的对象即可,比如发现a节点是需要移除的对象,那么可以令a节点的上一个节点的next=它的next.next。

这个题目存在的一个异界就是head有没有值和它的值是不是符合移除的条件。

所以虚设一个哨兵节点,让它的next=head

代码如下:

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head==null) return head;
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
        ListNode node=dummy;
        while(node.next!=null){
            if(node.next.val==val){  //这里判断node.next是否等于,如果等于,那么就可以让next直接指向next。next;
                node.next=node.next.next;//如果直接判断node是否等于val,那需要再定义一个节点用来保存node的上一个节点
            }else{
                node=node.next;
            }
            
        }
        return dummy.next;
    }
}

83. 删除排序链表中的重复元素

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head==null) return head;
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
        ListNode node=dummy;
        while(node.next!=null){
            if(node.next.val==val){
                node.next=node.next.next;
            }else{
                node=node.next;
            }
            
        }
        return dummy.next;
    }
}

82. 删除排序链表中的重复元素 II

这个题目和上一题的不同之处在于不保留一个,将相等的元素全部删除。我们可以分为一下几步:

1,考虑到首元素甚至开始的多个元素都是删除的对元素,所以要设置一个哨兵节点。

2,总体的思路是,设置前后两个指针,判断两个节点的值是否相同,如果不同,则同时指向下一个节点。如果相同考虑下一步处理。这就是和上一个题目的不同的地方。

3,假设此时快指针和慢指针相等了,由于后面还可能有相等的元素,我们可以加一个循环,如果让快指针指向下一个,如果还是相等,继续指向下一个,直到出现不相同的为止。

4,注意,此时不是让慢指针指向快指针的下一个节点,因为我们是要把所有相等的元素都删掉,所以慢指针指向的元素也要删掉。也就是让慢指针的前一个指针指向此时的快指针。我们可以使用慢指针指向的下一个节点的值也就是slow.next和快指针指向的元素比较,这样就可以直接令慢指针指向快指针的变量了。

代码如下:

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        while(head==null || head.next==null) return head;
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
        ListNode slow=dummy;
        ListNode fast=head;
        while(fast!=null && fast.next!=null){
            if(slow.next.val!=fast.next.val){
                slow=slow.next;
                fast=fast.next;
            }else{
                while(fast.next!=null && slow.next.val==fast.next.val){
                    fast=fast.next;
                }
                slow.next=fast.next;
                fast=fast.next;
            }
        }
        return dummy.next;
    }
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页