删除链表中重复的节点【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