题目要求:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
# -*- coding: utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class LinkList:
"""
创建一个链表类,链表由结点构成
"""
def __init__(self):
self.head = ListNode(0) # 创建一个带头结点(随便赋值,哑结点)的单链表
def InitList(self, data):
if len(data) == 0:
print('\nIt is a empty link list!')
return False
self.head.next = ListNode(data[0]) # 实例化结点,并将data[0]赋给头结点后第一个结点
p = self.head.next # 指针指向头结点后第一个结点
for i in data[1:]: # 将data中的其它数塞进链表
p.next = ListNode(i) # p.next原本是空的,担当被赋值时p.next就不为空
p = p.next # 同时也保证最后一个节点的next为空
def PrintList(self,p): # 打印链表
while p:
print(p.val, end=' ')
p = p.next
#主体部分
class Solution:
def deleteDuplication(self, pHead):#根据题目要求无头结点,返回pHead为头指针,pHead含有第一个数
# write code here
if (not pHead)or(not pHead.next):
return pHead
pPrev = None#定义一个空结点,一直跟着pNode,pPrev起往前都是不重复的结点
pNode = pHead
while pNode:#从第一个数开始循环
needToBeDel = False#是否删除判断标志
if pNode.next and pNode.val == pNode.next.val:
needToBeDel = True
if needToBeDel == False:
pPrev = pNode
pNode = pNode.next
else:
value = pNode.val
while pNode and pNode.val == value:#从该结点起往后删除与之数值相同的所有点
pToBeDel = pNode#复制结点位置
del pToBeDel#删除该结点
pNode = pNode.next#跳到下一个节点
if pPrev == None:
pHead = pNode
else:
pPrev.next = pNode
return pHead
#测试部分
def main():
"""
测试
"""
temp = input("Input a list: ") # 输入数据
data = temp # 将数据存储在data中
lst = LinkList() # 创建/实例化单链表
lst.InitList(data) # 将data填入链表
print("before: ")
lst.PrintList(lst.head.next) # 打印链表
print("\nafter:")
solution = Solution()
solution.deleteDuplication(lst.head.next)
lst.PrintList(lst.head.next)
main()
测试结果: