52.删除链表中重复的结点(map的用法)

删除链表中重复的结点
  • 参与人数:1970时间限制:1秒空间限制:32768K
  • 本题知识点:  链表
  •  算法知识视频讲解

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
对这个题目思考,可以发现,出现的链表值和它的出现的次数 是一种对应关系,自然联想到 哈希表的 key-value 这种对应,或者应用关联容器 map,可以很方便的解决这个问题。
map 容器中,它的一个元素 就是一组(key,value)对应的数据
// 52.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <map>
using namespace::std;

struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};

class Solution {
public:
	ListNode* deleteDuplication(ListNode* pHead) {
		if (pHead == NULL) return NULL;

		map<int, int> m;
		ListNode* p = pHead;

		while (p != NULL) {
			m[p->val] ++;
			p = p->next;
		}

		p = pHead;
		ListNode* next = pHead->next;
		while (p != NULL && next != NULL) {
			if (m[next->val] > 1) {
				p->next = next->next;
				next = next->next;
			}
			else{
				p = p->next;
				next = next->next;
			}
		}
		// 如果头结点是重复的,我们就要对头结点做特殊处理
		if (m[pHead->val] > 1){
			pHead = pHead->next;
		}
		return pHead;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	ListNode p1(1);
	ListNode p2(1);
	ListNode p3(1);
	ListNode p4(1);
	ListNode p5(1);
	ListNode p6(1);
	ListNode p7(2);

	p1.next = &p2;
	p2.next = &p3;
	p3.next = &p4;
	p4.next = &p5;
	p5.next = &p6;
	p6.next = &p7;

	Solution s;
	ListNode* result = s.deleteDuplication(&p1);
	return 0;
}


你可能感兴趣的:(52.删除链表中重复的结点(map的用法))