删除链表中重复的节点
Posted OneDay-X
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表中重复的节点相关的知识,希望对你有一定的参考价值。
一道来自剑指offer的编程题,题目描述如下:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路比较简单,就是从头结点开始遍历链表,若遇到(p->val == p->next->val)则删除p的下一节点(p->next),但是题目要求重复的节点不能保留,这才是题目的关键点,即需要删除此时的p节点,但是由于此情况下如果直接删除p节点,那么链表将导致断裂,所以需要额外引进一个p的前置节点(pre),并将pre的初始值赋为NULL用来判断需要删除的重复节点p是否为首节点。具体实现如下:
(ps:自己当时一个很智障的错误是while语句的第二行没有加temp的非空判断,导致程序非法访问出错,所以,严谨一点很重要)
/*
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* p = pHead;
ListNode* pre = NULL;
bool flag = false;
while (p)
ListNode* temp = p->next;
if (!flag && temp && (p->val != temp->val)) pre = p;
if (temp != NULL && p->val == temp->val)
p->next = temp->next;
delete temp;
temp = NULL;
flag = true;
else
if (flag)
if (pre != NULL) pre->next = p->next;
else pHead = p->next;
ListNode* toDel = p;
p = p->next;
delete toDel;
toDel = NULL;
flag = false;
continue;
p = p->next;
return pHead;
;
以上是关于删除链表中重复的节点的主要内容,如果未能解决你的问题,请参考以下文章