《剑指offer》第十八题(删除链表中重复的结点)
- // 面试题18(二):删除链表中重复的结点
- // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复
- // 结点被删除之后,链表如图3.4(b)所示。
- #include <iostream>
- #include "List.h"
- using namespace std;
- void DeleteDuplication(ListNode** pHead)//注意有可能删除头结点,所以是**
- {
- if (pHead == nullptr || *pHead == nullptr)
- return;
- ListNode* pPreNode = nullptr;//用来存储当前最后一个不删的节点
- ListNode* pNode = *pHead;//用来存储下一个待检测的节点
- while (pNode != nullptr)
- {
- ListNode *pNext = pNode->m_pNext;
- bool needDelete = false;
- if (pNext != nullptr && pNext->m_nValue == pNode->m_nValue)//开始检测是否删除
- needDelete = true;
- if (!needDelete)//不要删除的话就往下走
- {
- pPreNode = pNode;
- pNode = pNode->m_pNext;
- }
- else//要删除的话,看看删几个
- {
- int value = pNode->m_nValue;//记住要删的数
- ListNode* pToBeDel = pNode;
- while (pToBeDel != nullptr && pToBeDel->m_nValue == value)//满足
- {
- pNext = pToBeDel->m_pNext;
- delete pToBeDel;//删
- pToBeDel = nullptr;
- pToBeDel = pNext;
- }
- if (pPreNode == nullptr)//要是一直在删头结点,就把这个给头结点
- *pHead = pNext;
- else
- pPreNode->m_pNext = pNext;
- pNode = pNext;
- }
- }
- }
- // ====================测试代码====================
- void Test(const char* testName, ListNode** pHead, int* expectedValues, int expectedLength)
- {
- if (testName != nullptr)
- printf("%s begins: ", testName);
- DeleteDuplication(pHead);
- int index = ;
- ListNode* pNode = *pHead;
- while (pNode != nullptr && index < expectedLength)
- {
- if (pNode->m_nValue != expectedValues[index])
- break;
- pNode = pNode->m_pNext;
- index++;
- }
- if (pNode == nullptr && index == expectedLength)
- printf("Passed.\n");
- else
- printf("FAILED.\n");
- }
- // 某些结点是重复的
- void Test1()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ListNode* pNode3 = CreateListNode();
- ListNode* pNode4 = CreateListNode();
- ListNode* pNode5 = CreateListNode();
- ListNode* pNode6 = CreateListNode();
- ListNode* pNode7 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ConnectListNodes(pNode2, pNode3);
- ConnectListNodes(pNode3, pNode4);
- ConnectListNodes(pNode4, pNode5);
- ConnectListNodes(pNode5, pNode6);
- ConnectListNodes(pNode6, pNode7);
- ListNode* pHead = pNode1;
- int expectedValues[] = { , , };
- Test("Test1", &pHead, expectedValues, sizeof(expectedValues) / sizeof(int));
- DestroyList(pHead);
- }
- // 没有重复的结点
- void Test2()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ListNode* pNode3 = CreateListNode();
- ListNode* pNode4 = CreateListNode();
- ListNode* pNode5 = CreateListNode();
- ListNode* pNode6 = CreateListNode();
- ListNode* pNode7 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ConnectListNodes(pNode2, pNode3);
- ConnectListNodes(pNode3, pNode4);
- ConnectListNodes(pNode4, pNode5);
- ConnectListNodes(pNode5, pNode6);
- ConnectListNodes(pNode6, pNode7);
- ListNode* pHead = pNode1;
- int expectedValues[] = { , , , , , , };
- Test("Test2", &pHead, expectedValues, sizeof(expectedValues) / sizeof(int));
- DestroyList(pHead);
- }
- // 除了一个结点之外其他所有结点的值都相同
- void Test3()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ListNode* pNode3 = CreateListNode();
- ListNode* pNode4 = CreateListNode();
- ListNode* pNode5 = CreateListNode();
- ListNode* pNode6 = CreateListNode();
- ListNode* pNode7 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ConnectListNodes(pNode2, pNode3);
- ConnectListNodes(pNode3, pNode4);
- ConnectListNodes(pNode4, pNode5);
- ConnectListNodes(pNode5, pNode6);
- ConnectListNodes(pNode6, pNode7);
- ListNode* pHead = pNode1;
- int expectedValues[] = { };
- Test("Test3", &pHead, expectedValues, sizeof(expectedValues) / sizeof(int));
- DestroyList(pHead);
- }
- // 所有结点的值都相同
- void Test4()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ListNode* pNode3 = CreateListNode();
- ListNode* pNode4 = CreateListNode();
- ListNode* pNode5 = CreateListNode();
- ListNode* pNode6 = CreateListNode();
- ListNode* pNode7 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ConnectListNodes(pNode2, pNode3);
- ConnectListNodes(pNode3, pNode4);
- ConnectListNodes(pNode4, pNode5);
- ConnectListNodes(pNode5, pNode6);
- ConnectListNodes(pNode6, pNode7);
- ListNode* pHead = pNode1;
- Test("Test4", &pHead, nullptr, );
- DestroyList(pHead);
- }
- // 所有结点都成对出现
- void Test5()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ListNode* pNode3 = CreateListNode();
- ListNode* pNode4 = CreateListNode();
- ListNode* pNode5 = CreateListNode();
- ListNode* pNode6 = CreateListNode();
- ListNode* pNode7 = CreateListNode();
- ListNode* pNode8 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ConnectListNodes(pNode2, pNode3);
- ConnectListNodes(pNode3, pNode4);
- ConnectListNodes(pNode4, pNode5);
- ConnectListNodes(pNode5, pNode6);
- ConnectListNodes(pNode6, pNode7);
- ConnectListNodes(pNode7, pNode8);
- ListNode* pHead = pNode1;
- Test("Test5", &pHead, nullptr, );
- DestroyList(pHead);
- }
- // 除了两个结点之外其他结点都成对出现
- void Test6()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ListNode* pNode3 = CreateListNode();
- ListNode* pNode4 = CreateListNode();
- ListNode* pNode5 = CreateListNode();
- ListNode* pNode6 = CreateListNode();
- ListNode* pNode7 = CreateListNode();
- ListNode* pNode8 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ConnectListNodes(pNode2, pNode3);
- ConnectListNodes(pNode3, pNode4);
- ConnectListNodes(pNode4, pNode5);
- ConnectListNodes(pNode5, pNode6);
- ConnectListNodes(pNode6, pNode7);
- ConnectListNodes(pNode7, pNode8);
- ListNode* pHead = pNode1;
- int expectedValues[] = { , };
- Test("Test6", &pHead, expectedValues, sizeof(expectedValues) / sizeof(int));
- DestroyList(pHead);
- }
- // 链表中只有两个不重复的结点
- void Test7()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ListNode* pHead = pNode1;
- int expectedValues[] = { , };
- Test("Test7", &pHead, expectedValues, sizeof(expectedValues) / sizeof(int));
- DestroyList(pHead);
- }
- // 结点中只有一个结点
- void Test8()
- {
- ListNode* pNode1 = CreateListNode();
- ConnectListNodes(pNode1, nullptr);
- ListNode* pHead = pNode1;
- int expectedValues[] = { };
- Test("Test8", &pHead, expectedValues, sizeof(expectedValues) / sizeof(int));
- DestroyList(pHead);
- }
- // 结点中只有两个重复的结点
- void Test9()
- {
- ListNode* pNode1 = CreateListNode();
- ListNode* pNode2 = CreateListNode();
- ConnectListNodes(pNode1, pNode2);
- ListNode* pHead = pNode1;
- Test("Test9", &pHead, nullptr, );
- DestroyList(pHead);
- }
- // 空链表
- void Test10()
- {
- ListNode* pHead = nullptr;
- Test("Test10", &pHead, nullptr, );
- }
- int main(int argc, char* argv[])
- {
- Test1();
- Test2();
- Test3();
- Test4();
- Test5();
- Test6();
- Test7();
- Test8();
- Test9();
- Test10();
- system("pause");
- return ;
- }
《剑指offer》第十八题(删除链表中重复的结点)的更多相关文章
- 剑指offer五十六之删除链表中重复的结点
一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 【校招面试 之 剑指offer】第18题 删除链表中的节点
题目一:在O(1)时间内删除链表节点. 给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点. 思路:(1)如果要删除的节点不是链表的尾节点,则将被删除节点的内容复制到该节点,然 ...
- 《剑指offer》第二十三题(链表中环的入口结点)
// 面试题23:链表中环的入口结点 // 题目:一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中, // 环的入口结点是结点3. #include <iostream> ...
- 剑指Offer(十八):二叉树的镜像
剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...
- 【Java】 剑指offer(18) 删除链表中重复的结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重 ...
- 【剑指Offer】删除链表中重复的结点 解题报告(Python)
[剑指Offer]删除链表中重复的结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点)
203题是在链表中删除一个固定的值,83题是在链表中删除重复的数值,但要保留一个:82也是删除重复的数值,但重复的都删除,不保留. 比如[1.2.2.3],83题要求的结果是[1.2.3],82题要求 ...
- 剑指offer-18-2. 删除链表中重复的结点
剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-> ...
- [PHP] 算法-删除链表中重复的结点的PHP实现
删除链表中重复的结点: 1.定义两个指针pre和current 2.两个指针同时往后移动,current指针如果与后一个结点值相同,就独自往前走直到没有相等的 3.pre指针next直接指向curre ...
随机推荐
- 用python写http接口自动化测试框架
本文是转载张元礼的博客 http://blog.csdn.Net/vincetest 一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值 输出:XML文 ...
- Java中将xml文件转化为json的两种方式
原文地址https://blog.csdn.net/a532672728/article/details/76312475 最近有个需求,要将xml转json之后存储在redis中,找来找去发现整体来 ...
- JQuery中如何使用事件来出发Ajax
$(document).ready(function(){ $("input[name='customer_name']").keydown(func ...
- linux make configure make
开放源码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行: 编译程序:将程序代码转译成为机器看得懂的语言,就类似编译者的角色: 可执行文件:经过编译程序变成二进制后机器看得懂所以可以 ...
- AO中的空间关系
名词解释: Boundary(边界): 只有线和面才有边界.面的边界是指组成面的框架线:线的边界是指线的二个端点(即起点和终点,不包括中间部分的节点):点没有边界. Interior(内部): 除去边 ...
- 【VS Hacks】定制VS
# Hack 24 定制快捷键 VS能够做很多键盘的配置,其实在VS中目前已经发现有很多的快捷键了,但是在这个技巧篇里会学到如何创建新的快捷键,以及编辑已有的快捷键.VS中包含很多的命令,只有其中 ...
- 2018-2019-2 20165209 《网络对抗技术》Exp4:恶意代码分析
2018-2019-2 20165209 <网络对抗技术>Exp4:恶意代码分析 1 基础问题回答和实验内容 1.1基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监 ...
- Linux服务器---基础设置
Centos分辨率 virtualbox里新安装的Centos 7 的分辨率默认的应该是800*600. 如果是‘最小化安装’的Centos7 进入的就是命令模式 .如果安装的是带有GUI的 ...
- 【JavaScript】数组随机排序 之 Fisher–Yates 洗牌算法
Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列.Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yat ...
- 50个CSS技巧
这里我工作中收集了10个很不错的CSS技巧,你可以用在你的项目上.它可以帮你很好地整理你的元素并让他们看起来蛮酷的.下面开始我们的内容,希望你会喜欢它.下面是我收集的CSS技巧,希望能帮助到你,感觉收 ...