前言
这题比较简单,就是一个链表中的删除节点操作以及节点值比较的过程。
题目
描述
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为
1
→
1
→
2
1→1→2
1→1→2,返回
1
→
2
1→2
1→2.
给出的链表为
1
→
1
→
2
→
3
→
3
1→1→2→3→3
1→1→2→3→3,返回
1
→
2
→
3
1→2→3
1→2→3
数据范围:链表长度满足
0
≤
n
≤
100
0≤n≤100
0≤n≤100,链表中任意节点的值满足
∣
v
a
l
∣
≤
100
∣val∣≤100
∣val∣≤100
进阶:空间复杂度
O
(
1
)
O(1)
O(1),时间复杂度
O
(
n
)
O(n)
O(n)
示例1
输入:{1,1,2}
返回值:{1,2}
示例2
输入:{}
返回值:{}
解决方案一
1.1 思路阐述
使用两个指针,两两比较节点之间的数据,如果一致则保留一个节点的数据,另一个删除。如果不一致,则指针同时后移。
step 1:判断链表是否为空链表,空链表不处理直接返回。
step 2:使用一个指针遍历链表,如果指针当前节点与下一个节点的值相同,我们就跳过下一个节点,当前节点直接连接下个节点的后一位。
step 3:如果当前节点与下一个节点值不同,继续往后遍历。
step 4:循环过程中每次用到了两个节点值,要检查连续两个节点是否为空。
1.2 源码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
ListNode* rec=head;
ListNode* cur=head;
if(!head)
return nullptr;
else
cur->val=head->val;
head=head->next;
while (head) {
if(cur->val!=head->val)
{
head=head->next;
cur=cur->next;
continue;
}
else
{
ListNode* tempNode=head;
head=head->next;
cur->next=head;
}
}
return rec;
}
};
总结
主要是对链表的删除操作的复习回顾。