删除排序链表中的重复节点II(C++解法)

题目

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:

删除排序链表中的重复节点II(C++解法)_第1张图片

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

删除排序链表中的重复节点II(C++解法)_第2张图片

输入:head = [1,1,1,2,3]
输出:[2,3]

C++代码

#include 
using namespace std;

//定义链表结构体
struct ListNode {
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {}
	ListNode(int x) : val(x), next(nullptr) {}
	ListNode(int x, ListNode* next) : val(x), next(next) {}
};

/*
* 删除排序链表中的重复节点问题
* 定义dummyNode哑节点和cur节点
* 判断cur->next和cur->next->next节点不为空
* while循环删除重复节点和节点本身
*/
ListNode* deleteDuplicates(ListNode* head) {
	if (!head) {
		return head;
	}
	ListNode* dummyNode = new ListNode(0, head);
	ListNode* cur = dummyNode;
	while (cur->next && cur->next->next) {
		if (cur->next->val == cur->next->next->val) {
			int x = cur->next->val;
			while (cur->next && cur->next->val == x) {
				cur->next = cur->next->next;
			}
		}
		else {
			cur = cur->next;
		}
	}
	ListNode* ans = dummyNode->next;
	delete dummyNode;
	return ans;
}

int main() {
	ListNode* n1 = new ListNode(1);
	ListNode* n2 = new ListNode(2);
	ListNode* n3 = new ListNode(3);
	ListNode* n4 = new ListNode(3);
	ListNode* n5 = new ListNode(4);
	ListNode* n6 = new ListNode(4);
	ListNode* n7 = new ListNode(5);
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = n5;
	n5->next = n6;
	n6->next = n7;
	n7->next = nullptr;

	ListNode* head = n1;
	ListNode* ans = deleteDuplicates(head);
	while (ans) {
		cout << ans->val << " ";
		ans = ans->next;
	}

	delete n1, n2, n3, n4, n5, n6, n7;
	return 0;
}

分析

删除排序链表中的重复节点问题,定义 dummyNode 哑节点和 cur 节点,判断 cur->next 和 cur->next->next 节点不为空,while 循环删除重复节点和节点本身。

问题

本来想加一个pre节点增加代码可读性,但是写出来超时了,不知道什么问题。

你可能感兴趣的:(链表,c++,数据结构)