存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
方法有很多种哈,个人采用栈的方法拿到非重复元素,然后使用尾插法构造链表
#include<iostream>
#include <stack>
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) {}
};
class Solution {
public:
/* 利用栈求出不重复的链表节点 */
ListNode* deleteDuplicates(ListNode* head) {
ListNode* nhead;
ListNode* nTmp = head;
bool isSame = false; /* 用于判断是否有相同元素 */
while (nTmp != NULL) {
/* 每次与栈顶比较,相同的话节点移动到下一个节点 */
if (!m_stack.empty() && m_stack.top() == nTmp->val) {
nTmp = nTmp->next;
isSame = true;
continue;
}
else {
/* 有相同元素,pop栈顶 */
if (isSame && !m_stack.empty()) {
m_stack.pop();
isSame = false;
}
m_stack.push(nTmp->val);
}
nTmp = nTmp->next;
}
/* 最后一次跳出循环,栈顶有相同,仍然需要pop */
if (isSame && !m_stack.empty()) {
m_stack.pop();
isSame = false;
}
return constructList();
}
/* 采用尾插法 */
ListNode* constructList() {
ListNode* tailNode = NULL;
while (!m_stack.empty()) {
ListNode* node = new ListNode(m_stack.top());
node->next = tailNode;
tailNode = node;
m_stack.pop();
}
return tailNode;
}
private:
stack<int> m_stack;
};
int main() {
ListNode* head = new ListNode(1);
ListNode* node1 = new ListNode(2);
ListNode* node2 = new ListNode(3);
ListNode* node3 = new ListNode(3);
ListNode* nodeT = new ListNode(3);
ListNode* node4 = new ListNode(4);
ListNode* node5 = new ListNode(4);
ListNode* node6 = new ListNode(5);
ListNode* node7 = new ListNode(5);
head->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = nodeT;
nodeT->next = node4;
node4->next = node5;
node5->next = node6;
Solution* ps = new Solution();
ListNode* node = ps->deleteDuplicates(head);
while (node!= NULL) {
cout << node->val << endl;
node = node->next;
}
system("pause");
return 0;
}