AdamDuncan

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  27 随笔 :: 0 文章 :: 0 评论 :: 19955 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

本来挺容易的一道题,做起来就有很多问题,解决了之后,也感觉到自己的一些进步

首先要排除一些好解决的问题,链表结点就容易出现一些问题

最重要的就是当headPtr节点为NULL了,这时候就退出了,但是headBefore的值可能还要放入ret链表中去

在最后headPtr和headBefore两个节点的值比较的过程之中,分两个的值相等与不相等,进行后续处理得出最后的结果

首先ret:指向返回链表首结点

retPtr:指向返回链表的末尾节点,用来增长链表

pHeadPtr:指向pHead链表,用来移动判断

pHeadBefore:指向pHead链表,用来与pHeadPtr判断出来不想等的值,就把这个值产生新的节点加入ret

总体思路就是

1、先讨论链表为NULL的和链表只有一个结点的,将这两种情况排除之后,就是判断值pHeadBefore->value和pHeadPtr->value是否相等

2、不相等,就加入pHeadBefore->value;相等就移动pHeadPtr,直到不相等,使得pHeadBefore=pHeadPtr,pHeadPtr=pHeadPtr->next

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include<iostream>
using namespace std;
 
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* ret = NULL;
        //
        ListNode* retPtr = NULL;
        //现链表的前一个节点
        ListNode* pHeadBefore = pHead;
        //指向现节点
        ListNode* pHeadPtr = pHead->next;
        //retPtr = ret;
        while (pHeadPtr != NULL)
        {
            if (pHeadPtr->val != pHeadBefore->val)
            {
                if (ret == NULL)
                {
                    ret = new ListNode(pHeadBefore->val);
                    retPtr = ret;
                } else {
                    retPtr->next = new ListNode(pHeadBefore->val);
                    retPtr = retPtr->next;
                }
                pHeadBefore = pHeadPtr;
                pHeadPtr = pHeadPtr->next;
                if (pHeadPtr == NULL)
                {
                    retPtr->next= new ListNode(pHeadBefore->val);
                }
            } else {
                while(pHeadPtr != NULL && pHeadPtr->val == pHeadBefore->val)
                {
                    pHeadPtr = pHeadPtr->next;
                }
                if (pHeadPtr != NULL)
                {
                    pHeadBefore = pHeadPtr;
                    pHeadPtr = pHeadPtr->next;  
                    if (pHeadPtr == NULL)
                    {
                        if (ret != NULL)
                        {
                            retPtr->next = new ListNode(pHeadBefore->val);
                        }
                    }
                }      
            }
        }
        if (ret == NULL)
        {
            //只有一个节点的情况
            if (pHeadBefore->next == NULL)
            {
                return new ListNode(pHeadBefore->val);
            }  
        }
        return ret;
    }
};
void printListNode(ListNode* root)
{
    if (root == NULL)
    {
        cout<<"NULL"<<endl;
    }
    while (root != NULL)
    {
        cout<<root->val<<" ";
        root = root->next;
    }
    cout<<endl;
}
int main()
{
    ListNode l1(1);
    ListNode l2(2);
    ListNode l3(3);
    ListNode l4(3);
    ListNode l5(4);
    ListNode l6(4);
    ListNode l7(5);
    l1.next = &l2;
    l2.next = &l3;
    l3.next = &l4;
    l4.next = &l5;
    l5.next = &l6;
    l6.next = &l7;
    printListNode(&l1);
    printListNode(Solution().deleteDuplication(&l1));
    return 0;
}

  

posted on   AdamDuncan  阅读(1496)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
点击右上角即可分享
微信分享提示