题解 | #删除链表中重复的结点#
删除链表中重复的结点
http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef
实现思路
利用一个unordered_map来存储链表中每个结点值出现的次数。然后遍历一遍链表。遇见结点值超过两次的直接跳过即可。
使用一个指针指向没有重复链表的结尾,然后用另一个指针去寻找值没有重复的那个结点,然后拼接在没有重复链表的结尾即可。
代码实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
if(!pHead) return nullptr;
unordered_map<int,int> m;
ListNode *dummy = new ListNode(-1);
ListNode *p = pHead;
//遍历链表,把结点值存储到unordered_map中
while(p)
{
m[p->val]++;
p = p->next;
}
dummy->next = pHead;
ListNode *pre = dummy;
ListNode *cur = pHead;
while(cur)
{
//如果该结点不重复,把这个结点拼接在没有重复链表的结尾,让两个指针继续走
if(m[cur->val]==1)
{
pre->next = cur;
cur = cur->next;
pre = pre->next;
}
else //否则就去找值没有重复的那个结点
{
cur = cur->next;
}
}
//防止 1 2 2 3 4 4这种情况 输出1 3 4 4.
//正常情况下pre->next是cur。如果不是,则说明末尾的结点都是重复的
if(pre->next!=cur) pre->next=nullptr;
//如果都是重复的结点,比如2 2 3 3 4 4,那么pre指针根本不会移动
if(pre==dummy) return {};
else return dummy->next;
}
};