删除排序链表中重复的结点(C++)
2015-12-03 15:59
423 查看
题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,最后返回链表头指针。
如:
链表1->2->3->3->4->4->5
输出为 1->2->5
思路:
定义辅助指针:p pre q和resHead。初始时 p和pre都指向链表头指针。
resHead初始化为值为-1。(头结点前的一个结点)
接下来依次遍历链表。p始终指向当前遍历到的结点。
A 如果p和p的下一个结点值相等 => 向后遍历。p = p -> next
否则
B 如果p的下一个结点存在 判断pre和p是否相等。 (同一个结点)
相等 => 说明指向的这个结点不是重复 将p链接到q。
C p的下一个结点不存在 说明已经遍历到最后一个结点。 指向B中相同的判断。
最后 将链表的最后一个结点置空。
贴代码:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,最后返回链表头指针。
如:
链表1->2->3->3->4->4->5
输出为 1->2->5
思路:
定义辅助指针:p pre q和resHead。初始时 p和pre都指向链表头指针。
resHead初始化为值为-1。(头结点前的一个结点)
接下来依次遍历链表。p始终指向当前遍历到的结点。
A 如果p和p的下一个结点值相等 => 向后遍历。p = p -> next
否则
B 如果p的下一个结点存在 判断pre和p是否相等。 (同一个结点)
相等 => 说明指向的这个结点不是重复 将p链接到q。
C p的下一个结点不存在 说明已经遍历到最后一个结点。 指向B中相同的判断。
最后 将链表的最后一个结点置空。
贴代码:
#include <iostream> using namespace std; typedef int dataType; struct DulNode { dataType val; struct DulNode *next; DulNode(dataType _val): val(_val), next(NULL){} }; void buildLink(DulNode **head) { dataType _val; cin>>_val; if (_val == -1) { *head = NULL; return; } DulNode *p = NULL; while(_val != -1) { DulNode *tmp = (DulNode*)malloc(sizeof(DulNode)); tmp->val = _val; if (*head == NULL) { p = tmp; *head = tmp; } else { p->next = tmp; p = p->next; } cin>>_val; } p->next = NULL; } void traverseLink(DulNode *head) { DulNode *p = head; while(p) { cout<<(p->val)<<" "; p = p->next; } cout<<endl; } DulNode* deleteDuplication(DulNode *pHead) { if (pHead == NULL || pHead->next == NULL) { return pHead; } DulNode *p = pHead; DulNode *pre = p; DulNode *resHead = new DulNode(-1); // 最终输出链表头结点的前一个结点 DulNode *q = resHead; while(p != NULL) { // 有重复结点 p往后遍历 if (p->next && p->val == p->next->val) { p = p->next; } else if(p->next) { // 当前p指向的结点不是重复结点 if (pre == p) { // 加入 q->next = new DulNode(p->val); q = q->next; } // pre和p 都指向下一个结点 pre = p->next; p = p->next; } // 遍历到最后一个结点 else { // 不是重复结点 加入 if (pre == p) { q->next = new DulNode(pre->val); q = q->next; } break; } } // 链表尾结点置空 q = NULL; return resHead->next; // 输出头结点 } int main(void) { DulNode *head = NULL; buildLink(&head); traverseLink(head); head = deleteDuplication(head); traverseLink(head); return 0; }
相关文章推荐
- 模仿实现C++库函数----String 类----用 写时拷贝 实现
- 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
- C语言字符和字符串的比较
- C++11 JNI开发中RAII的应用(二)--JNI函数封装
- NSString 与C++ string字符串的互转
- C语言清空输入缓冲区的N种方法对比【转】
- tinyxml删除,添加,修改xml文件
- C++ socket 通信客户端和服务器端
- LeetCode(92): Reverse Linked List II (C++)
- [c、c++]宏中"#"和"##"的用法(zz)
- STM32 IAP文档 common.h文件参考
- 新手学习C++笔记5:函数的调用
- C++矩阵处理工具Eigen类浅析
- 《c语言入门经典》Ivor Horton第十章练习题4
- VC++ 解压有密码的.zip文件
- C++ 简单的文件加密和解密 实例
- 指针类型学习总结(函数指针、数组指针和指针数组)
- Python实例浅谈之三Python与C/C++相互调用
- c语言总结
- c++;双向循环链表