码迷,mamicode.com
首页 > 其他好文 > 详细

删除链表中的重复节点

时间:2018-08-30 00:18:46      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:and   就删除   设定   删除链表   nbsp   new   lam   next   self   

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路

有好几种方法,先讲两种,不递归的,第三种递归,暂时不会。。

第一种,简单粗暴,把链表所有元素都放到一个列表里,然后把列表中数量大于1的元素删除,再把这些元素串成链表

第二种,设定一个新的头结点(0),然后定两个指针,一个指针初始节点在原来的头结点,另一个指针在0结点,然后让0结点作为头结点的根节点;第一个指针去遍历链表,当遇到重复结点的时候,就跳过,跳到后面的非重复节点上去,第二个指针就始终停在重复节点的前一个节点(也就是非重复节点)上。

详细描述一下,以题目描述中的链表为例,

1、一开始指针一在1节点上,指针二在0节点上,然后指针一、二分别向后遍历,当遇到重复节点时,此时指针一是3节点,指针二是2节点,指针二不会动,指针一会跳到指针4上去,同样遇到了重复节点4,指针一会跳到节点5上去,然后再把指针一的结点5和指针二的节点2相连,这样就删除了重复节点

解答

方法1

class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        res = []
        while pHead:
            res.append(pHead.val)
            pHead = pHead.next
        res = list(filter(lambda c: res.count(c) == 1, res))
        newHead = ListNode(0)
        pre = newHead
        for i in res:
            node = ListNode(i)
            pre.next = node
            pre = pre.next
        return newHead.next

方法2

class Solution:
    def deleteDuplication(self, pHead):
        first = ListNode(0)
        first.next = pHead
        pre = pHead
        last = first
        while pre and pre.next:
            if pre.val != pre.next.val:
                pre = pre.next
                last = last.next
            else:
                val = pre.val
                while pre and pre.val == val:
                    pre = pre.next
                last.next = pre
        return first.next

 

删除链表中的重复节点

标签:and   就删除   设定   删除链表   nbsp   new   lam   next   self   

原文地址:https://www.cnblogs.com/yqpy/p/9557493.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!