面试题02.01.移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2] 输出:[1, 2]
提示:
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
题解:
小编在写这道题的时候没有使用缓冲区的方法,而是定义了两个指针p,q
p指针指向head,q指针指向p
即在给定的链表上使用双重循环,第一重循环从链表的头节点开始,枚举一个保留的节点,也就是保留最开始出现的节点。第二重循环是从枚举的保留节点开始,到链表的末尾结束,将所以与其保留节点相同的节点全部移除。
这样也就是用时间换空间,时间复杂度会增加
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeDuplicateNodes(struct ListNode* head) {
if(head==NULL||head->next==NULL)
{
return head;
}
struct ListNode*p=head;
while(p!=NULL&&p->next!=NULL)
{
struct ListNode*q=p;
while(q->next!=NULL)
{
if(p->val==q->next->val)
{
q->next=q->next->next;
}
else{
q=q->next;
}
}
p=p->next;
}
return head;
}