剑指offer - 删除链表中重复的结点 - python

57 阅读1分钟

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

思路:

  • 链表法:首先遍历链表获取所有结点的val,然后移除所有个数大于1的值,接着利用处理后的结果构造新的链表,最后返回新链表的头结点即可。

  • 指针法构建一个新节点连接到给定链表,设置指针head值向新节点,那么p.next == pHead,即给定链表的表头,用于返回结果。设置指针p指向可能重复节点的前一个结点,指针cur寻找可能重复的结点。从头结点开始往后走,当遇到curcur.next指向的结点值相同时,执行 p = cur.next,cur = cur.next来删除已存在的重复结点,直到cur.next = None表示走到尾了,终止算法


    在这里插入图片描述


AC代码

链表法

# -*- 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:
            return None
        
        nodes = []
        p = pHead
        while p:
            nodes.append(p.val)
            p = p.next
        
        for i in set(nodes):
            if nodes.count(i) > 1:
                while i in nodes:
                    nodes.remove(i)
                    
        if nodes == []:
            return None
        if len(nodes) == 1:
            return ListNode(nodes[0])
        
        newHead = ListNode(nodes[0])
        cur = newHead
        for i in nodes[1:]:
            node = ListNode(i)
            cur.next = node
            cur = cur.next
            
        return newHead

指针法

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        head = ListNode(-1)
        p = head
        p.next = pHead
        cur = pHead
        while cur and cur.next:
            if cur.val != cur.next.val:
                p = p.next
                cur = cur.next
            else:
                val = cur.val
                while cur and cur.val == val:
                    cur = cur.next
                p.next = cur
        return head.next