题目
删除链表中重复的节点
a) 1->2->3->3->4->4->5
b)1->2->5
一、思路一
使用两个指针。如果第一个指针和第二个指针内容相同,则需要删除这两个节点。
可以将p2的下一个节点的内容复制给p1,再另p1指向p2的下一个节点,等同与删除了当前的p1和p2节点~这种处理方式在处理头节点和第二个节点内容重复时,不需要新建一个头节点~
但是这种方式的问题在于,如果尾部的两个节点相同,则没办法回溯到上一个不重复的节点令它指向None。
def delete_duplication(head):
p1 = head
p2 = head.next
while p2:
if p1.var == p2.var:
if p2.next:
p1.var = p2.next.var
p1.next = p2.next.next
p2 = p1.next
else:
p1.var = None
p1.next = None
p2 = None
else:
p1 = p1.next
p2 = p1.next
二、思路二
思路一提供的方式存在尾节点重复无法删除的问题,增加一个指针,保存上一个节点则能处理这种情况。
def delete_duplication_2(head):
p1 = head
p2 = head.next
p3 = head
while p2:
print(p1.var, p2.var)
if p1.var == p2.var:
if p2.next:
p1.var = p2.next.var
p1.next = p2.next.next
p2 = p1.next
if p1 != head:
p3 = p3.next
else:
p3.next = None
p2 = None
else:
p1 = p1.next
p2 = p1.next
以上两种思路都不能处理,全部都是重复元素的链表。有待思考改进~