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

来源:互联网 发布:算法设计与分析王秋芬 编辑:程序博客网 时间:2024/06/08 05:27

题目如下:

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
原创粉丝点击