关于LeetCode中Remove Linked List Elements一题的理解

题目如下:

Remove all elements from a linked list of integers that have value val.

Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5

    相当简单的一道题。给定一个链表和一个需要删除的val值,将链表中所有val值等于给定值的节点删除,最后返回链表表头。像这种问题一般都需要至少声明两个ListNode类型的变量,一个需要一直向前进行移动,然后使用“经过”的每个节点的值与给定val值进行判断;另一个ListNode主要的作用是记住“移动”节点之前的那个节点,这样容易进行删除操作。先上已Accepted的代码,如下所示:

public ListNode removeElements(ListNode head, int val) {
        ListNode node1 = head;
        ListNode pre = null;
        while(node1!=null){
            if(node1.val!=val){
                pre = node1;
            }else{
                if(pre==null){
                    head = node1.next;
                }else{
                    pre.next = node1.next;
                }
            }
            node1 = node1.next;
        }
        return head;
    }
    这里需要特别注意的就是第一个节点就是需要删除的节点这种情况,这时候要将node1即第一个节点的值赋值给head,那结束后返回的head就应该从此处开始(假如后面紧跟着的节点值不是val的话,如果紧跟着的节点的值是val,那就需要重复上述步骤直到第一个非val节点出现为止)。另外一点就是,假如在一次循环中删除了一个节点,那pre的位置是不需要变化的,因为pre的next已经变成了另一个新节点,这个新节点就是下次需要进行判断的,所以没必要将pre进行移动。

    然后是评论区的大神代码,其中有一个是使用大家喜闻乐见的递归形式的,代码如下:

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

    递归的思想就是逐步解决子问题,这个和之前有一道题的递归解法十分类似,右面的是之前一篇博客的链接,讲的也是和链表递归操作相关的一些问题:http://blog.csdn.net/zsy112371/article/details/52415591

    评论区的另一种方法,和我使用的方法思想类似,但是可能更简练一些,代码如下:

public ListNode removeElements(ListNode head, int val) {
        ListNode top=new ListNode(0);
        top.next=head;
        ListNode node=top;
        while(node.next!=null) {
            if(node.next.val==val) {
                node.next=node.next.next;
            }else{
                node=node.next;
            }
        }
        return top.next;
    }
    还有下面这种思想都是一样的。

public ListNode removeElements(ListNode head, int val) {
        ListNode fakeHead = new ListNode(-1);
        fakeHead.next = head;
        ListNode curr = head, prev = fakeHead;
        while (curr != null) {
            if (curr.val == val) {
                prev.next = curr.next;
            } else {
                prev = prev.next;
            }
            curr = curr.next;
        }
        return fakeHead.next;
    }
    今天有些不开心,sad。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值