LeetCode——203. 移除链表元素 思路以及思考过程

在学校学习期间,链表的学习被我忽略了,从今天开始从0学习。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head.val==val){
            head=head.next;
        }
        for(int i=1;ListNode(i).next==null;i++){
            if(ListNode(i).next==val){
                ListNode(i).next=ListNode(i+1).next;
            }
        }
    }
}

上图是我第一版写出的代码(当然是没编译通过的),接下来在我看完题解之后分析下我这版题解的问题:

方法一

代码如下:

public ListNode removeElements(ListNode head, int val) {
    while(head!=null && head.val==val) {
        head = head.next;
    }
    ListNode curr = head;
    while(curr!=null && curr.next !=null) {
        if(curr.next.val == val){
            curr.next = curr.next.next;
        } else {
            curr = curr.next;
        }
    }
    return head;
}

1.首先最开始对边界的分析不全面,如果head.next的val也等于val的话,显然只判断一次的话是不够的,所以应该用while进行循环,直到找到一个值不等于val的节点为head。而且没考虑到head为null的情况。

2.在第二个循环中,由于对链表的语法不够了解,以及在数组中过多使用for循环,不太熟悉while循环,让我妄想用for循环遍历数组的方式遍历链表,实在有够蠢。第二个while循环的第一个判断条件是防止空的表头进入循环(和第一个while循环的第一个判断条件相同作用),第二个判断条件,是把curr.next一直筛选到不等于val的节点作为下一个节点(或者null作为下一个节点,再次遍历循环就结束了)。

ps:在遍历链表时还需要创建一个curr作为临时变量,我的理解是和for中的i起相同作用。


方法二

代码如下:

public ListNode removeElements(ListNode head, int val) {
    // 设置一个虚拟的头结点
    ListNode dummy = new ListNode();
    dummy.next = head;

    ListNode cur = dummy;
    while (cur.next != null) {
        if (cur.next.val == val) {
            cur.next = cur.next.next;
        } else {
            cur = cur.next;        
        }
    }
    return dummy.next;
}

这种方法相较于方法一巧妙之处就在于设置了一个虚拟的头结点(由于为自己new的节点,所以肯定不为null,省去了一定的判断环节),把原有的头结点直接变为常规的后续节点,统一化判断流程,最后返回虚拟头部节点的next就OK了。


方法三

递归(相当于从链表尾部重新构建链表重新构建链表)代码如下:

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head==null){
            return head;
        }
        head.next=removeElements(head.next,val);

        if(head.val==val){
            return head.next;
        }
        else{
            return head;
        }
    }
}

注意:if的位置要在递归调用之前,否则在链表末尾结点会调用null.next会报错。

你可能感兴趣的:(leetcode,链表,算法)