剑指offer:76-题解 | #删除链表中重复的结点#
删除链表中重复的结点
http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef
题目描述
示例1
输入: {1,2,3,3,4,4,5}
返回值: {1,2,5}
题解1:使用双指针
首先一个比较「直观且通用」的思路是,采用「边遍历边构造」的方式:
建一个虚拟头节点myhead
以减少边界判断,往后的答案链表会接在 myhead 后面;
通过原输入的 pHead 指针进行链表扫描。 对原链表进行遍历,只要原链表尚未到达结尾,我们就重复如下决策(保留/跳过逻辑).
图示来自宫水三叶的刷题日记,在此引用
- 「当前节点」与「下一节点」值不同,当前节点进行保留:
- 「当前节点」与「下一节点」值相同,跳过「相同的连续一段」,当前节点不能保留:
代码
ListNode* myhead = new ListNode(-1);
myhead->next = pHead;
ListNode* pre = myhead;
ListNode* cur = pHead;
ListNode* temp = NULL;
while (cur)
{
if (cur->next && cur->val == cur->next->val) {
//先找到第一次重复的元素
temp = cur;//找到重复元素
cur = cur->next;//cur指向第二个重复的元素
//delete cur;//释放空间牛客网中不需要释放空间,但实际需要
while (cur->next && cur->next->val == cur->val)//多个元素重复
{
temp = cur;
cur = cur->next;//指向最后一个重复的元素
//delete temp;牛客网中不需要释放空间,但实际需要
}
//第一次重复的所有元素找完
temp = cur;//temp指向最后一个重复的元素
cur = cur->next;//cur指向最后一个重复元素的下一个节点
pre->next = cur;//每当重复元素找完之后,pre.next要指向不重复元素的节点
}
else {
pre = cur;//元素不重复,要向下移动指针
cur = cur->next;
}
//只要cur不为空,循环查找有序链表中的重复元素的节点,并删除
}
temp = myhead->next;
// delete myhead;牛客网中不需要释放空间,但实际需要
return temp;