题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 Solution:
def deleteDuplication(self, pHead):
# write code here
'''定义两个指针,res指针(指向新链表结点),tmp指针从第一个结点开始
1.判断一下tmp指针及tmp.next指针的数据域是否相同,相同则该指针向后移动两个结点,删除两 个重复结点
2.如果不相同,则该节点是不重复结点,将其添加到新链表中去,构成新链表的结点,
再把res指针向后移动一个结点'''
#创建一个新链表存放删除重复结点的链表
result=ListNode(0)
result.next=pHead
#指向新链表结点的指针
res = result
#指向pHead链表结点的指针
tmp=pHead
while tmp and tmp.next:
if tmp.val==tmp.next.val:
while tmp.next and tmp.val==tmp.next.val:
tmp=tmp.next
else:
res.next=tmp
res=res.next
tmp=tmp.next
res.next=tmp
return result.next
先前我做过类似题目,与上题不同的是,只需要去除重复结点中的一个,例如:链表1->2->3->3->4->4->5 处理后为 1->2->3->4->5
附上这种情况的代码:
#移除无序链表中的重复项
'''通过双重循坏直接在链表上执行删除操作。
外层循坏用一个指针从第一个节点开始遍历整个链表,
内层循环用另一个指针遍历其余结点,将其与外层循环遍历到得指针所指结点的数据域相同的结点删除'''
def removeDup(head):
if head == None or head.next==None:
return
#定义外层循环
#存放链表头节点
res = head
#外层循坏,指向链表的第一个结点
outCircle = head
#内存循环
inCircle = None
存放内存循环的前置结点,后面找到相同删除重复结点时需要用到
inPre =None
while outCircle:
#对于外层循坏的每一个结点,内层循环都遍历了其余所有结点与之对比
inCircle = outCircle.next
inPre = outCircle
while inCircle:
if outCircle.val == inCircle.val:
inPre.next = inCircle.next
inCircle = inCircle.next
else:
inPre =inCircle
inCircle = inCircle.next
outCircle = outCircle.next
return res