Remove Duplicates from Sorted List II--LeetCode
2015-12-20 21:57
288 查看
题目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.For example,
Given
1->2->3->3->4->4->5,
return
1->2->5.
Given
1->1->1->2->3,
return
2->3.
思路:先锁定头,然后处理中间位置,记得最后处理尾部,知识繁琐。处理头部时。找到一个节点,当前节点没有同样的连续节点,同一时候节点和后序节点不同。处理中间仅仅须要记录前序节点和遍历节点就可以。使得遍历节点没有连续同样的节点。假设有连续同样的节点,那么删除全部的连续同样的节点
#include <iostream> #include <vector> using namespace std; typedef struct list_node List; struct list_node { int value; struct list_node* next; }; void Init_List(List*& head,int* array,int n) { head = NULL; List* tmp; List* record; for(int i=1;i<=n;i++) { tmp = new List; tmp->next = NULL; tmp->value = array[i-1]; if(head == NULL) { head = tmp; record = head; } else { record->next = tmp; record = tmp; } } } void print_list(List* list) { List* tmp=list; while(tmp != NULL) { cout<<tmp->value<<endl; tmp = tmp->next; } } void RemoveDuplicate(List*& head) { if(head == NULL || head->next==NULL) return ; List* pre=head; List* cur; List* fast; if(head->value == head->next->value) { while(1) { while(pre != NULL &&pre->next != NULL) { if(pre->value == pre->next->value) pre = pre->next; else break; } pre = pre->next; if(pre->next == NULL || pre->value != pre->next->value) { head = pre; break; } } } if(head == NULL) return ; pre = head; cur=head->next; while(cur !=NULL && cur->next != NULL) { if(cur->value != cur->next->value) { if(pre->next != cur) // 不相邻 { cur = cur->next; pre->next = cur; } else { pre = cur; cur = cur->next; } } else { cur = cur->next; } } if(pre->next!=NULL && pre->next->next !=NULL) { if(pre->next->value == pre->next->next->value) pre->next = NULL; } } int main() { int array[]={1,1,1,2,2,3,4,4,4,5,5,7,7,8}; List* head; Init_List(head,array,sizeof(array)/sizeof(int)); RemoveDuplicate(head); print_list(head); return 0; }PS:看到每个题目,首先尽可能考虑全面,并且要考虑怎样使用更加简洁的思路来解决这个问题,在这个题目中,首先须要考虑刚開始就有不符合条件的节点,那么第一步须要处理的就是找到终于的头部节点,然后再解决删除节点,那么在删除的时候每次考虑两个节点。考虑这两个相邻的节点是否一样,假设一样。那么就是循环删除当前节点值的过程。假设不同,那么就须要将第一个节点插入到终于的链表中。
相关文章推荐
- 我了个大擦-PDO(二)
- 第一次试验
- mac-android-虚机加速
- RecyclerView
- SVN冲突解决和注意事项
- scanf问题:先用一个scanf读入一个数后,再用一个scanf读入一个字符时,不等输入直接跳过!
- uva 11149 - Power of Matrix 【倍增 + 矩阵快速幂】
- 【蓝桥第五周】小小故事
- The MAX
- Linux常用命令
- 安卓开发之调用摄像头、相册
- 关于php和docker
- mysql安装遇到../depcomp: line 512: exec: g++: not found报错解决
- 为MyEclipse指定JDK
- IntelliJ IDEA 问题总结之中的一个 —— jar包、assets、maven、git
- ApiDemos之activity切换动画
- 关于DDOS、DOS、CC攻击那点事
- Linux下Qt程序的打包发布
- centos7 开启80端口
- HDOJ 5240 Exam