时间限制:1秒
空间限制:32768K
热度指数:123981
算法知识视频讲解
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL || pHead->next == NULL)
return pHead;
ListNode *head = new ListNode(-2);
head->next = pHead;
ListNode *p = head;
ListNode *q = head->next;
while (q)
{
while (q->next && (q->next->val == q->val))
{
q = q->next;
}
if (p->next != q)
{
q = q->next;
p->next = q;
}
else
{
p = q;
q = q->next;
}
}
return head->next;
}
};
设置一个头结点,头结点并不是真正的链表头结点,而是指向链表的第一个元素的指针,p为移动的链表尾结点,q为原链表的遍历结点。
1、若链表为空或者只有一个元素,直接返回原链表。
2、q遍历结点时,若有重复值就直接跳过。此时有两种情况,一种是q即为p的后一个结点,p和q之间没有需要删除的结点,这种情况下两个元素分别后移就可以。第二种情况就是p和q之间有重复的元素,此时p并不后移,而是q后移(跳过所有的重复的元素,但是q后面的元素也有可能有重复值,所以并不能将p后移),但是p和q相连接。