关于LeetCode中Remove Duplicates from Sorted List一题的理解

来源:互联网 发布:宽带域名是什么意思 编辑:程序博客网 时间:2024/06/08 02:00

题目如下:

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

    这道题还是很有意思的,给定一个已经排好顺序的链表,要求删除链表中所有重复value的元素,这个看example中的例子就应该很清楚了。他有意思的地方在于它是链表,和数组不一样,链表中的元素都是“一个接一个”排列的,使用HashMap那种数据结构解决这个问题就不那么便捷。解决链表类问题基本上都要靠改变“next”指针指向的元素,从而调整整个链表的排列,最后返回原链表头即可。虽然返回的是原链表头,但是通过一些执行一些操作后,整个列表的内容和排列顺序都会变得不同。举个例子,你在大街上牵着链子遛狗,有个小偷把你的名贵狗换成一般狗,但是你牵的链子还是那条链子,但狗已经不是那条狗了。这回先上已Accepted的代码,再解释一下思路:

public ListNode deleteDuplicates(ListNode head) {        ListNode temp = head;        while(temp!=null&&temp.next!=null){            if(temp.next.val == temp.val){                temp.next = temp.next.next;            }else{                temp = temp.next;            }        }        return head;    }
    首先将head赋值给temp,这条语句使temp和head指向了同一个内存地址,现在可以把head理解为链子,temp虽然现在什么也没做,但是等会充当的确是小偷的勾当,temp要将链表扫描一遍,并在扫描的时候进行必要的操作。开始“扫描”链表时要判断temp是不是null,temp的next是不是null,如果temp是null或者temp的next是null,就没有必要进行扫描了(因为此时整个链表只有0个或1个node节点,可以直接返回),直接返回head即可。如果链表的长度大于等于2,就要进行扫描。主要就是判断当前节点(temp)的value值和下一个节点(temp.next)的value值是不是相等,如果相等说明出现了重复,应当将temp.next指向temp.next的next,这个非常好理解,此时temp不向前移动,因为你不知道下一个节点是不是也是相同值的。那什么时候可以进行移动呢?当然就是当前节点的value值和下一个节点的value 值不相等的时候,此时可以放心地将temp移动到下一个节点。举个具体的例子,1->1->2->3,temp最开始的时候在第一个1的位置,一次循环后变成1->2->3,temp还是在第一个节点的位置,只不过她的next变成了2,下一次循环是temp的位置就会变到2这个位置。

    然后是评论区中的方法,评论区中有一个人采用了递归的方法解决了这个问题。还是通过例子了解一下思路:有这么一个链表1->(1->2->3->4->4->6),第一个node的next应该指向括号中的链表进行去重复操作后返回的链表头,然后再通过比较和这个表头中value值的大小关系,确定应该返回第一个node还是这个已进行去重复操作后的链表头。即如果不相等,就返回第一个node,相等就返回进行过去重复操作的那个链表头。显然这是一个递归的过程,好了,不多说了,直接看代码,写一写更容易理解:

public ListNode deleteDuplicates(ListNode head) {        if(head == null || head.next == null)return head;        head.next = deleteDuplicates(head.next);        return head.val == head.next.val ? head.next : head;}
    这个题还是很interesting的,开学第二天,又忙了一天的事情啊。


1 0
原创粉丝点击