题解 | #删除链表中重复的结点#

删除链表中重复的结点

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;
    }
};
全部评论

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务