题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
-
链表法:首先遍历链表获取所有结点的val,然后移除所有个数大于1的值,接着利用处理后的结果构造新的链表,最后返回新链表的头结点即可。
-
指针法构建一个新节点连接到给定链表,设置指针head值向新节点,那么
p.next == pHead
,即给定链表的表头,用于返回结果。设置指针p指向可能重复节点的前一个结点,指针cur寻找可能重复的结点。从头结点开始往后走,当遇到cur和cur.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