删除排序链表中的重复元素 II
问题描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
解题思路
/**
* Definition for singly-linked list.
* 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* pre_head = new ListNode(0,head);
ListNode* cur = pre_head;
while(1){
if(!cur->next||!cur->next->next)//若下一个结点或下下一个结点为空,则不用交换
break;
else{
int flag = 0;//用来标志当前结点是否为重复结点,初始时都假设不重复
ListNode* p = cur->next;
ListNode* q = p->next;
if(p->val == q->val){
//若有重复,则删除
ListNode* temp = q;
p->next = q->next;
q = temp->next;
delete temp;
flag = 1;//标记该节点为重复的
}
if(flag == 1 && (!q || p->val != q->val)){
//删除该重复节点
cur->next = q;
delete p;
}
if(flag == 0)//不重复,则cur指针后移
cur = cur->next;
}
}
return pre_head->next;
}
};
递归思路:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head || !head->next) {
//递归结束的条件
return head;
}
if (head->val == head->next->val) {
//若有重复
while (head && head->next && head->val == head->next->val) {
//跳过所有的重复结点
head = head->next;
}
return deleteDuplicates(head->next);
} else {
//无重复
head->next = deleteDuplicates(head->next);
return head;
}
}
};
分隔链表
问题描述
给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
解题思路
维护一个small和big链表,将小于x的结点都接到small链表中,将大于或等于x的结点都接到big链表中,最后将big链表接到small链表的后面。
/**
* Definition for singly-linked list.
* 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* partition(ListNode* head, int x) {
ListNode* big_head = new ListNode();
ListNode* big_cur = big_head;
ListNode* small_head = new ListNode();
ListNode* small_cur = small_head;
while(head){
if(head->val < x){
small_cur->next = head;
small_cur = small_cur->next;
head = head->next;
}else{
big_cur->next = head;
big_cur = big_cur->next;
head = head->next;
}
}
small_cur->next = big_head->next;
big_cur->next = nullptr;
return small_head->next;
}
};