删除链表中重复的节点
这是剑指offer中 18题的第二小题。
第一小题:删除链表中指定节点
需要考虑当该节点在链表的结尾、该节点在链表的头节点、当链表在中间节点的三种情况,
这是删除链表的相同节点
这道题需要注意的是:
1、可能链表的头节点被删除的情况
2、可以参照链表的反转思路,使用三个指针来实现
以下是代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
if(pHead == nullptr && pHead->next == nullptr)
{
return pHead;
}else
{
ListNode *newHead = new ListNode(0);
newHead->next = pHead;
//定义三个节点,一个指向当前节点、当前节点的前一个节点、当前节点的后一个节点
ListNode *PerNode = nullptr;
ListNode *p = pHead;//当前节点,也是遍历的开始
ListNode *next = nullptr;//当前节点的下一个节点
while(p!=nullptr && p->next != nullptr)
{
//先保存当前节点的指向
next = p->next;
if(p->val == next->val)//当出现重复节点的时候
{
while(next != nullptr && next->val == p->val)
{
//循环主要是为了继续向后搜寻节点相等的部分
next = next->next;
}
//将pre直接指向next就相当于删除了当前节点
PerNode->next = next;
p = next;
}else{
//当前节点和下一个节点值不相等,就继续移动指针
PerNode = p;
p = p->next;
}
}
return newHead->next;
}
}
};
京公网安备 11010502036488号