题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
算法分析
思路比较简单,遇到重复的节点就删除,但是需要将问题考虑完全,具体的来讲
- 链表首元素重复。比如输入的链表为1->1->2->3->3->5
- 尾结点重复。比如输入的链表为1->2->3->3->3->3
程序代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == nullptr)//空列表
return pHead;
//增加头结点,方便返回头指针
ListNode* HeadNode = new ListNode(0);
HeadNode->next = pHead;
ListNode* PreNode = HeadNode;
ListNode* CurNode = pHead;
while(CurNode != nullptr)
{
//注意CurNode->next != nullptr需要加上,当尾结点不重复时,确保退出
//思路:如果发现重复,就从第一个重复点出发,一直向下遍历,依次将重复点删除
if(CurNode->next != nullptr && CurNode->val == CurNode->next->val)
{
int Same_val = CurNode->val;
while(CurNode != nullptr && CurNode->val == Same_val)
{
PreNode->next = CurNode->next;
delete CurNode;
CurNode = PreNode->next;
}
}
else
{
PreNode = CurNode;
CurNode = CurNode->next;
}
}
return HeadNode->next;
}
};