题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
Solution
不保留重复节点:使用辅助节点,注意node.next的判断。
- 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
- 设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplication(self, pHead):
if pHead is None or pHead.next is None:
return pHead
newHead = ListNode(-1)
newHead.next = pHead
pre = newHead
last = pre.next
# 待删除的节点直接跳过了,1->2->2->3后结果为1->3 2节点没有释放内存
while last is not None:
if last.next is not None and last.val == last.next.val:
while last.next is not None and last.val == last.next.val:
last = last.next
pre.next = last.next
last = last.next
else:
pre = last
last = last.next
return newHead.next
另一个题型,保留一个重复的节点:不使用辅助头节点。
class Solution:
def deleteDuplication(self, pHead):
if pHead is None:
return None
p1, p2 = pHead, pHead.next
while p2 is not None:
if p2.val == p1.val:
tmp = p2
p2 = p2.next
del tmp
p1.next = p2
else:
p1 = p2
p2 = p2.next
p1.next = p2
return pHead