删除链表中重复的节点【Python】

删除链表中重复的结点

http://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef

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

解题思路:三个指针分别指向当前所在位置cur,上一个位置former,下一个位置latter。外层while循环结束的条件是latter指向链表末尾。

当cur和latter指向的链表的val不等时,三个指针同时向后移动

当cur和latter指向的链表的val相等时,向后移动latter,当cur的val和latter的val不等时,进行删除重复链表的操作,将former.next=latter。测试例子中一种特别情况需要注意,{1,1,1,1,1,1}输出结果为{},所以当latter向后移动的时候,需要考虑是否已经移动到链表末尾。

-- coding:utf-8 --

class ListNode:

def init(self, x):

self.val = x

self.next = None

class Solution:
def deleteDuplication(self, pHead):
# write code here
if pHead == None or pHead.next == None:
return pHead

    head = ListNode(None)    # 虚拟首节点
    head.next = pHead
    anchor = head    # anchor.next为输出结果
    cur = pHead    # cur指向当前链表
    former = head    # former指向当前链表的前一个链表
    latter = cur.next   # latter指向当前链表的后一个链表

    while latter:
        if cur.val == latter.val:
            # 找到第一个不等于当前节点val的节点,用latter指向它
            while cur.val == latter.val:
                latter = latter.next
                # latter如果为None,无法执行latter.val
                if latter == None:
                    break
            temp = latter
            cur = temp
            former.next = cur    # 删除重复元素操作,让former所指链表指向cur
            if cur == None:    # 如果latter移动到链表末尾,则令latter = None,结束while
                latter = None
            else:
                latter = cur.next
        else:
            former = former.next # 更新former指针
            cur = former.next    # 更新cur指针
            latter = cur.next    # 更新latter指针
    return anchor.next
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务