链表中的next为什么不会重复_[剑指offer]25删除链表中重复的节点

本文介绍了如何删除排序链表中的重复节点,通过Python和C++两种语言分别给出解决方案,包括将节点值放入列表再筛选和通过指针操作直接删除重复节点的方法。此外,还提供了Java版本的代码实现。最后,鼓励读者每日坚持算法练习,共同进步。
摘要由CSDN通过智能技术生成

今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

1 题目描述

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

2 思路1----python

将所有节点得值放到一个列表中,再筛选出值数量为1得值----python

3 思路2----c++

  • 需要删除重复节点,我们需要保留一个待删除节点之前得节点,代码中使用pre表示

  • 使用一个指针指向当前遍历得节点

  • 当头节点与后续节点相等时需额外处理

4 代码实现

c++版本

//author xiaolan
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead){
        if (pHead == NULL)
            return NULL;
        ListNode *pre = NULL;
        ListNode *p = pHead;
        int flag = 0;   //判断是否出现重复节点,当flag==1时,当前节点出现重复
        while (p)
        {
            while (p->next && p->val == p->next->val)  //如果节点重复,一直遍历下去
            {
                flag = 1;
                p = p->next;
            }
            if (flag == 0)   //如果当前节点不重复,遍历下一个节点
            {
                pre = p;
                p = p->next;
            }
            else     //如果当前节点重复,分类处理
            {
                flag = 0;
                if (pre == NULL)   //如果从头结点开始出现重复,重置头结点指针
                {
                    pHead = p->next;
                    p = pHead;
                }
                else              //否则,跳过重复的节点
                {
                    pre->next = p->next;
                    p = pre->next;
                } 
            }
        }
        return pHead;
    }
};

java版本

public class Solution {
    public ListNode deleteDuplication(ListNode head){
        ListNode first=new ListNode(-1);//新建一个头节点,避免,从head就开始重复
        first.next=head;
        ListNode current=head;
        ListNode start=first;  //保存重复节点的前一个节点
        while(current!=null&&current.next!=null){
            if(current.val==current.next.val){
                int value=current.val;
                while(current!=null&&current.val==value){
                    current=current.next;
                }
                 start.next=current;
            }else{
                start=current;
                current=current.next;
            }
        }
        //注意要返回first.next,避免从head就开始重复,而head被删除
        return first.next;
    }
}

python版本

#author xiaolan
class Solution:
    def deleteDuplication(self, pHead):
        res = []
        # 所有元素入列表
        while pHead:
            res.append(pHead.val)
            pHead = pHead.next
        res = list(filter(lambda c: res.count(c) == 1, res))
        dummy = ListNode(0)
        pre = dummy
        for i in res:
            node = ListNode(i)
            pre.next = node
            pre = pre.next
        return dummy.next

5 唠嗑

2020年7月23日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。

c085054eb2beb0708a8a25931012fc20.png

[剑指offer]20二叉树的镜像[剑指offer]19连续子数组最大和[剑指offer]2替换空格[剑指offer]3从尾到头打印链表[剑指offer]4栈实现队列[剑指offer]5斐波那契数列[剑指offer]6跳台阶[剑指offer]8二进制中1的个数炸裂!万字长文拿下HTTP
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值