本来挺容易的一道题,做起来就有很多问题,解决了之后,也感觉到自己的一些进步
首先要排除一些好解决的问题,链表结点就容易出现一些问题
最重要的就是当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; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络