删除链表中重复的节点
2015-08-15 16:58
363 查看
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5#include <iostream> #include "List.h" using namespace std; //删除重复的节点 void deleteDuplication(ListNode** pHead) { if(pHead == NULL || *pHead == NULL) return; ListNode* PreNode = NULL; ListNode* pNode = *pHead; while (pNode != NULL) { ListNode* pNext = pNode ->m_pNext; bool toBeDelete = false; if(pNext != NULL && pNode ->m_nValue == pNext ->m_nValue ) toBeDelete = true; if(!toBeDelete) { PreNode = pNode; pNode = pNext; }else { int value = pNode ->m_nValue; ListNode* toBeDel = pNode; while(toBeDel != NULL && toBeDel ->m_nValue == value) { pNext = toBeDel ->m_pNext; delete toBeDel; toBeDel = NULL; toBeDel = pNext; } if(PreNode == NULL) { *pHead = pNext; //删除头结点的情况 }else { PreNode ->m_pNext = pNext; } pNode = pNext; } } }
// ==================== Test Code ==================== void Test(char* testName, ListNode** pHead, int* expectedValues, int expectedLength) { if(testName != NULL) printf("%s begins: ", testName); deleteDuplication(pHead); int index = 0; ListNode* pNode = *pHead; while(pNode != NULL && index < expectedLength) { if(pNode->m_nValue != expectedValues[index]) break; pNode = pNode->m_pNext; index++; } if(pNode == NULL && index == expectedLength) printf("Passed.\n"); else printf("FAILED.\n"); } // some nodes are duplicated void Test1() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(3); ListNode* pNode5 = CreateListNode(4); ListNode* pNode6 = CreateListNode(4); ListNode* pNode7 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); ConnectListNodes(pNode5, pNode6); ConnectListNodes(pNode6, pNode7); ListNode* pHead = pNode1; int expectedValues[] = {1, 2, 5}; Test("Test1", &pHead, expectedValues, sizeof(expectedValues)/sizeof(int)); DestroyList(pHead); } // all nodes are unique void Test2() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ListNode* pNode6 = CreateListNode(6); ListNode* pNode7 = CreateListNode(7); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); ConnectListNodes(pNode5, pNode6); ConnectListNodes(pNode6, pNode7); ListNode* pHead = pNode1; int expectedValues[] = {1, 2, 3, 4, 5, 6, 7}; Test("Test2", &pHead, expectedValues, sizeof(expectedValues)/sizeof(int)); DestroyList(pHead); } // all nodes are duplicated except one void Test3() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(1); ListNode* pNode3 = CreateListNode(1); ListNode* pNode4 = CreateListNode(1); ListNode* pNode5 = CreateListNode(1); ListNode* pNode6 = CreateListNode(1); ListNode* pNode7 = CreateListNode(2); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); ConnectListNodes(pNode5, pNode6); ConnectListNodes(pNode6, pNode7); ListNode* pHead = pNode1; int expectedValues[] = {2}; Test("Test3", &pHead, expectedValues, sizeof(expectedValues)/sizeof(int)); DestroyList(pHead); } // all nodes are duplicated void Test4() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(1); ListNode* pNode3 = CreateListNode(1); ListNode* pNode4 = CreateListNode(1); ListNode* pNode5 = CreateListNode(1); ListNode* pNode6 = CreateListNode(1); ListNode* pNode7 = CreateListNode(1); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); ConnectListNodes(pNode5, pNode6); ConnectListNodes(pNode6, pNode7); ListNode* pHead = pNode1; Test("Test4", &pHead, NULL, 0); DestroyList(pHead); } // all nodes are duplicated in pairs void Test5() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(1); ListNode* pNode3 = CreateListNode(2); ListNode* pNode4 = CreateListNode(2); ListNode* pNode5 = CreateListNode(3); ListNode* pNode6 = CreateListNode(3); ListNode* pNode7 = CreateListNode(4); ListNode* pNode8 = CreateListNode(4); 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, NULL, 0); DestroyList(pHead); } // nodes are duplicated in pairs except two void Test6() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(1); ListNode* pNode3 = CreateListNode(2); ListNode* pNode4 = CreateListNode(3); ListNode* pNode5 = CreateListNode(3); ListNode* pNode6 = CreateListNode(4); ListNode* pNode7 = CreateListNode(5); ListNode* pNode8 = CreateListNode(5); 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[] = {2, 4}; Test("Test6", &pHead, expectedValues, sizeof(expectedValues)/sizeof(int)); DestroyList(pHead); } // a list with two unique nodes void Test7() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ConnectListNodes(pNode1, pNode2); ListNode* pHead = pNode1; int expectedValues[] = {1, 2}; Test("Test7", &pHead, expectedValues, sizeof(expectedValues)/sizeof(int)); DestroyList(pHead); } // only one node in a list void Test8() { ListNode* pNode1 = CreateListNode(1); ConnectListNodes(pNode1, NULL); ListNode* pHead = pNode1; int expectedValues[] = {1}; Test("Test8", &pHead, expectedValues, sizeof(expectedValues)/sizeof(int)); DestroyList(pHead); } // a list with only two duplidated nodes void Test9() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(1); ConnectListNodes(pNode1, pNode2); ListNode* pHead = pNode1; Test("Test9", &pHead, NULL, 0); DestroyList(pHead); } // empty list void Test10() { ListNode* pHead = NULL; Test("Test10", &pHead, NULL, 0); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); Test8(); Test9(); Test10(); return 0; }
相关文章推荐
- 一个可以将usb摄像头的视频和麦克风采集的声音以RTMP协议发布到RTMP Server的应用程序
- 结构型模式之代理模式
- Maven安装简单配置
- 河南理工大学oj 1700 做不出来踢协会!!!
- 出栈到第几个控制器
- android 音频策略介绍
- go read text file into string array
- [位操作]数据位提升的隐式转换
- 51 管闲事的小明
- AOJ 0121 Seven Puzzle
- MySQL、Oracle、SQL Server
- 配置android studio环境2
- C++中的运算符重载
- chmod无法修改权限的问题
- iOS系统定位权限弹出框和跳转系统设置页面的调研
- Swift学习笔记系列——(21)协议
- FZU 2087 统计树边
- Python 之 glob读取路径下所有文件夹或文件方法
- Known plaintext attack
- 记录