https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
思路
先处理链表节点数小于等于1的,然后逐个扫描已排序链表。遇到相同的就删除节点,修改next即可。
也可以在原始链表基础上修改。设置new_head,保持head始终在其前方,判断两个链表头是否相同,相同就让head向后,否则更新new_head。
或者新建一个节点,pre,扫描原链表,去重往新链表上面接。
答案
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <stack>
#include <set>
#include <queue>
#include <algorithm> //标准算法的头文件
using namespace std;
//链表
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
void printList(ListNode* node) {
while(node) {
cout << node->val << endl;
node = node->next;
}
}
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL) //链表长度为0
return NULL;
if (head->next == NULL) //链表长度为1
return head;
ListNode* new_head = head; //记录头部
ListNode* pre_node = head; //记录前驱
head = head->next; //从第二节点开始扫描
while (head) {
if (pre_node->val == head->val) {
pre_node->next = head->next;
head = head->next;
}
else {
pre_node = head;
head = head->next;
}
}
return new_head;
}
};
void test02() {
ListNode a(1);
ListNode b(1);
ListNode c(3);
ListNode d(3);
ListNode e(4);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
Solution solution;
ListNode* root = solution.deleteDuplicates(&a);
printList(root);
}
int main() {
test02();
system("pause");
return 0;
}
//直接在原始链上修改。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL)
return head;
ListNode* new_head=head;
head=head->next; //向后移动
new_head->next=NULL;
ListNode* ret=new_head;
while(head) {
if(head->val==new_head->val)
head=head->next;
else {
new_head->next=head;
head=head->next;
new_head=new_head->next;
new_head->next=NULL;
}
}
return ret;
}
};
该博客讨论了如何删除已排序链表中的重复元素,以确保每个元素仅出现一次。提供了三种不同的解决方案:直接修改原始链表、使用额外指针记录新链表和创建新链表去重。每种方法都通过移动指针和比较节点值来实现去重。

483

被折叠的 条评论
为什么被折叠?



