移除重复节点

/*
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

 输入:[1, 2, 3, 3, 2, 1]
 输出:[1, 2, 3]
示例2:

 输入:[1, 1, 1, 1, 2]
 输出:[1, 2]
提示:

链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:

如果不得使用临时缓冲区,该怎么解决?

来源:力扣(LeetCode)
*/
/*
说明:
1、空间换时间:哈希表或者map保存值的状态,存在就删除;
2、时间换空间,内外循环遍历;
*/

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeDuplicateNodes(struct ListNode* head){
	struct ListNode *ptr1 = NULL, *ptr2 = NULL, *tmpPtr= NULL ,*ptr = NULL;

	if (!head) {
		return NULL;
	}
	ptr1 = head;
	while (ptr1) {
		ptr = ptr1;
		ptr2 = ptr->next;
		while (ptr2) {
			if (ptr2->val == ptr1->val) {
				tmpPtr = ptr2;
				ptr2 = ptr2->next;
				ptr->next = ptr2;
				free(tmpPtr);
			}else{
				ptr = ptr->next;
				ptr2 = ptr->next;
			}
		}
		ptr1 = ptr1->next;
	}
	
	return head;
}

在C++中,你可以使用哈希集合(unordered_set)配合迭代器来去除一个单链表中的重复节点。以下是实现这个功能的一个简单示例: ```cpp #include <iostream> #include <unordered_set> using namespace std; // 定义链表节点结构 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 移除链表中的重复节点 ListNode* removeDuplicates(ListNode* head) { unordered_set<int> seen; // 存储已见过的值 ListNode* prev = nullptr; ListNode* curr = head; while (curr != nullptr) { if (seen.find(curr->val) == seen.end()) { // 如果当前值未见过 seen.insert(curr->val); // 添加到已见值集合 prev = curr; // 更新prev指针到当前节点 } else { // 如果当前值重复,则删除它 ListNode* toDelete = curr; curr = curr->next; prev->next = curr; delete toDelete; } } return head; } // 打印链表 void printList(ListNode* head) { while (head != nullptr) { cout << head->val << " "; head = head->next; } cout << endl; } int main() { // 创建一个有重复节点的链表示例 ListNode* list = new ListNode(1); list->next = new ListNode(2); list->next->next = new ListNode(3); list->next->next->next = new ListNode(4); list->next->next->next->next = new ListNode(2); list->next->next->next->next->next = new ListNode(5); // 移除重复节点并打印结果 list = removeDuplicates(list); printList(list); return 0; } ``` 在这个例子中,我们遍历链表,如果遇到的节点值已经存在于`seen`集合中,就删除该节点;否则将节点值添加到集合中,并更新前驱节点的`next`指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值