菜鸟笔记
提升您的技术认知

剑指offer

《剑指offer》刷题目笔记

剑指offer 数组

《剑指offer》二维数组中的查找《剑指offer》旋转数组的最小数字《剑指offer》调整数组顺序使奇数位于偶数前面《剑指offer》数组中出现次数超过一半的数字《剑指offer》连续子数组的最大和《剑指offer》把数组排成最小的数《剑指offer》数组中的逆序对《剑指offer》数字在排序数组中出现的次数《剑指offer》数组中只出现一次的数字《剑指offer》数组中重复的数字《剑指offer》构建乘积数组

剑指offer 字符串

《剑指offer》替换空格《剑指offer》字符串的排列《剑指offer》第一个只出现一次的字符《剑指offer》左旋转字符串《剑指offer》翻转单词顺序序列《剑指offer》把字符串转换成整数《剑指offer》正则表达式匹配《剑指offer》表示数值的字符串

剑指offer 链表

《剑指offer》从尾到头打印链表《剑指offer》链表中倒数第k个结点《剑指offer》反转链表《剑指offer》合并两个排序的链表《剑指offer》复杂链表的复制《剑指offer》两个链表的第一个公共结点《剑指offer》链表中环的入口结点《剑指offer》删除链表中重复的结点

剑指offer 树

《剑指offer》重建二叉树《剑指offer》树的子结构《剑指offer》二叉树的镜像《剑指offer》从上往下打印二叉树《剑指offer》二叉树中和为某一值的路径《剑指offer》二叉树的深度《剑指offer》平衡二叉树《剑指offer》二叉树的下一个结点《剑指offer》对称的二叉树《剑指offer》按之字顺序打印二叉树《剑指offer》把二叉树打印成多行《剑指offer》序列化二叉树

《剑指offer》删除链表中重复的结点-ag真人游戏

阅读 : 183

题目描述

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

解题思路

删除重复结点,只需要记录当前结点前的最晚访问过的不重复结点ppre、当前结点pcur、指向当前结点后面的结点pnext的三个指针即可。如果当前节点和它后面的几个结点数值相同,那么这些结点都要被剔除,然后更新ppre和pcur;如果不相同,则直接更新ppre和pcur。

需要考虑的是,如果第一个结点是重复结点我们该怎么办?这里我们分别处理一下就好,如果第一个结点是重复结点,那么就把头指针phead也更新一下。

代码实现(c )

/*
struct listnode {
    int val;
    struct listnode *next;
    listnode(int x) :
        val(x), next(null) {
    }
};
*/
class solution {
public:
    listnode* deleteduplication(listnode* phead)
    {
        if(phead == null){
            return null;
        }
        // 指向当前结点前最晚访问过的不重复结点
        listnode* ppre = null;
        // 指向当前处理的结点
        listnode* pcur = phead;
        // 指向当前结点后面的结点
        listnode* pnext = null;
        while(pcur != null){
            // 如果当前结点与下一个结点相同
            if(pcur->next != null && pcur->val == pcur->next->val){
                pnext = pcur->next;
                // 找到不重复的最后一个结点位置
                while(pnext->next != null && pnext->next->val == pcur->val){
                    pnext = pnext->next;
                }
                // 如果pcur指向链表中第一个元素,pcur -> ... -> pnext ->... 
                // 要删除pcur到pnext, 将指向链表第一个元素的指针phead指向pnext->next。
                if(pcur == phead){
                    phead = pnext->next;
                }
                // 如果pcur不指向链表中第一个元素,ppre -> pcur ->...->pnext ->... 
                // 要删除pcur到pnext,即ppre->next = pnext->next
                else{
                    ppre->next = pnext->next;
                }
                // 向前移动
                pcur = pnext->next;
            }
            // 如果当前结点与下一个结点不相同
            else{
                ppre = pcur;
                pcur = pcur->next;
            }
        }
        return phead;
    }
};

代码实现(python)

# -*- coding:utf-8 -*-
# class listnode:
#     def __init__(self, x):
#         self.val = x
#         self.next = none
class solution:
    def deleteduplication(self, phead):
        # write code here
        ppre = none
        pcur = phead
        pnext = none
        while pcur != none:
            if pcur.next != none and pcur.val == pcur.next.val:
                pnext = pcur.next
                while pnext.next != none and pnext.next.val == pcur.val:
                    pnext = pnext.next
                if pcur == phead:
                    phead = pnext.next
                else:
                    ppre.next = pnext.next
                pcur = pnext.next
            else:
                ppre = pcur
                pcur = pcur.next
        return phead
网站地图