目录
-
- 前言
- 一、删除链表中重复节点题的链接
-
- 题目描述
- 题目思路
- 二、删除链表中重复的元素题链接
-
- 题目描述
- 题目思路
- 总结
前言
???路还长
一、删除链表中重复节点题的链接
题目描述
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为1→1→2,返回1→ 2.
给出的链表为1→1→2→3→3,返回1→2→3.
测试样例1:
输入 {1,1,2} |
---|
返回值{1,2} |
测试样例2:
输入{1,1,1} |
---|
返回值{1} |
测试样例3:
输入{} |
---|
返回值NULL |
题目思路
- 重复就是最少得有两个相同,所以用两个指针,分别为慢指针和快指针。
- 慢指针指向头节点,快指针指向第二个节点。
- 用慢指针与快指针比较,如果不同,指针都进一,如果相同,快指针进一,接着比较。
注意:
先判断头节点是否为NULL; |
---|
如图:
代码如下:
class Solution {
public:/*** * @param head ListNode类 * @return ListNode类*/ListNode* deleteDuplicates(ListNode* head) {
// write code hereif(head==NULL)return NULL;struct ListNode*fast=NULL;struct ListNode*slow=NULL;slow=head;fast=head->next;while(fast){
if(fast->val!=slow->val){
fast=fast->next;slow=slow->next;}else{
slow->next=fast->next;fast=fast->next;}}return head;}
};
二、删除链表中重复的元素题链接
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
测试样例1:
输入 {1,2,3,3,4,4,5} |
---|
返回值{1,2,5} |
测试样例2:
输入{1,1,1,1,1} |
---|
返回值NULL |
题目思路
-
这个是删除重复的元素,所以用四个指针,一个快指针fast
-
一个慢指针slow
-
还有一个哨兵位指针guard来接收新开辟空间的地址,新开辟的空间为哨兵位,用来连接链表
-
另一个指针newhead一直指向新开辟的空间,用来记住头节点
-
用哨兵位先指向头节点
-
slow指向头节点,fast指向第二个节点,guard指向哨兵位,newhead一直指向哨兵位。
-
比较slow和fast,不同都进一,相同,fast进一
-
最后slow与fast不同的时候,guard要连向fast,slow要指向fast,fast再进一
注意:
1.先判断pHead是否为空 |
---|
2.fast一直进一,走动NULL的情况 |
如图:
代码如下:
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead){
if(pHead==NULL){
return pHead;}
// struct ListNode*slow=NULL;struct ListNode*fast=NULL;struct ListNode*slow=NULL;struct ListNode*guard=NULL;struct ListNode*newhead=NULL;guard=(struct ListNode*)malloc(sizeof(struct ListNode));newhead=guard;guard->next=pHead;fast=pHead->next;slow=pHead;while(fast){
if(slow->val!=fast->val){
fast=fast->next;slow=slow->next;guard=guard->next;}else{
while(slow->val==fast->val&&fast!=NULL){
fast=fast->next;}if(fast==NULL){
guard->next=NULL;return newhead->next;}guard->next=fast;slow=fast;fast=fast->next;}}return newhead->next;}
};
总结
希望你们有自己的收获,谢谢点赞?