[剑指offer]删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
示例1
输入:
{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):
if not pHead or not pHead.next: return pHead
pPreNode,pNode = None,pHead
while pNode:
pNext = pNode.next
if not(pNext and pNext.val == pNode.val):
# 如果不相等,则向后移动一个结点
pPreNode = pNode
pNode = pNode.next
else:
val = pNode.val #初始化要删除节点的值
pDeleteNode = pNode #定义要删除的节点
# 判断当前要删除的节点是否和val相等以及是否为空
while pDeleteNode and pDeleteNode.val == val:
pNext = pDeleteNode.next
pDeleteNode = pNext #节点后移
# 如果要删除的节点包含初始的头结点,那就需要将头结点移到当前节点的位置
if not pPreNode:
pHead = pNext
# 如果要删除的节点不包含头结点,则将节点进行连接
else:
pPreNode.next = pNext
# 开始从最新的节点开始遍历
pNode = pNext
# 返回头结点
return pHead