python code practice(三):链表、栈、队列

1、删除链表中重复节点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。

class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        # 判断链表是否为空
        if not pHead:
            return None
        pPreNode = None #存储要删除节点的前一个节点
        pNode = pHead #定义起始节点
        #开始循环
        while pNode:
            pNext = pNode.next
            needDelete = False
            #判断相邻的两个节点值是否相等
            if pNext and pNext.val == pNode.val:
                needDelete = True
            #如果不相等就后移一个, pPreNode指向最前面的节点
            if not needDelete:
                pPreNode = pNode
                pNode = pNode.next
            #如果相等就开始删除
            else:
                val = pNode.val #初始化要删除节点的值
                pDeleteNode = pNode #定义要删除的节点
                #判断当前要删除的节点是否和val相等以及是否为空
                while pDeleteNode and pDeleteNode.val == val:
                    pNext = pDeleteNode.next
                    del pDeleteNode #删除节点
                    pDeleteNode = pNext #节点后移
                #如果要删除的节点包含初始的头结点,那就需要将头结点移到当前节点的位置
                if not pPreNode:
                    pHead = pNext
                #如果要删除的节点不包含头结点,则将节点进行连接
                else:
                    pPreNode.next = pNext
                #开始从最新的节点开始遍历
                pNode = pNext
        #返回头结点
        return pHead
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        ans = head
        while head != None:
            if head.next != None and head.next.val == head.val:
                head.next = head.next.next
            else:
                head = head.next
        return ans
class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        if not pHead or not pHead.next:#如果链表为空或只有一个元素,直接返回
            return pHead
        if pHead.val==pHead.next.val:#如果当前结点与下一结点重复,继续查找是否还有重复的
            p=pHead.next.next
            while p and p.val==pHead.val:#如果p结点不为空且其值与当前重复的结点(pHead)相等
                p=p.next#p继续往后移位查找,直到没有重复的
            return self.deleteDuplication(p)#递归调用函数对头结点为p的链表进行处理
        #如果当前结点与下一结点不重复,递归调用函数对头结点为pHead.next的链表进行处理
        pHead.next=self.deleteDuplication(pHead.next)
        return pHead

猜你喜欢

转载自www.cnblogs.com/ariel-dreamland/p/12619401.html