题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析:
题目分两个问题,一是元素值比较,找出值相同的元素;二是操作链表将后向值相同的元素删;
思路:
首先会想到最简单的(时间复杂高)使用双层循环对链表中进行遍历,找到值相同的元素,并向后面元素删除(题目没有提到需要释放内存,考虑释放比较全面,但对答题不考虑没影响~-~)
另思路:参考牛客网
首先添加一个头结点,以防碰到第一、第二结点相同情况;
设置pre,last两个指针,pre指向当前确定不重复的结点,last相当于工作指针,指向下一个结点,来遍历整个链表;
关键实现代码
class Solution {
public:
ListNode deleteDuplication(ListNode pHead){
if(pHead == NULL || pHead.next == NULL)
{return pHead;}
ListNode Head = new ListNode(0);
Head.next = pHead;
ListNode pre = Head;
ListNode last = Head;
// 当前工作结点不为NULL
while(last != NULL){
if(last.next != NULL && last.val == last.next.val){
//找到最后一个相同结点
while(last.next != NULL && last.val == last.next.val){
last = last.next;
}
pre.next = last.next;
last = last.next;
}else{
pre = pre.next;
last = last.next;
}
}
return Head.next;
}
};
主要比较两个相邻结点的元素值,具体比较last->val与last->next->val,当两者相等时,更新当前确定不重复指针pre的指向,即更新pre的位置;对于1,2,2,3,3,4,4,5,6,6,7这样链表可以去掉重复的结点,但对于1,2,2,3,2,3,4,3,5,3,4,5,6;这样的无序的链表呢? 先对链表做排序,然后在比较连个相邻结点的值;
实现代码erro
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
//遍历链表中元素
ListNode* temp = pHead;
ListNode* p = pHead;
while(p){
while(temp){
// temp = temp->next;
if(p->val != temp->next->val){
temp = temp->next;
}
else{
free(temp->next);
temp->next = temp->next->next;
}
}
// temp = p->next;
p = p->next;
temp =p->next;
}
//找到重复结点并删除
return pHead;
}
};
原因?