Leetcode:Partition List 链表快速排序划分

Partition List

Given a linked list and a value x, partition it such that all
nodes less than x come before nodes greater than or equal
to x.

You should preserve the original relative order of the nodes in each of the
two partitions.

For example,
Given
 1->4->3->2->5->2 and x =
3,
return 1->2->2->4->3->5.

解题分析:

顺序遍历原链表,每遇到一个小于x的结点,我们将它从原链表摘除,并采用尾插法插入到新的结果链表中


class Solution {
public:
ListNode *partition(ListNode *head, int x) {
if (head == nullptr) return nullptr;
ListNode* newHead = new ListNode(0);
newHead->next = head;

ListNode* resHead = new ListNode(0);
ListNode* resCur = resHead;

ListNode* cur = newHead;
while (cur->next != NULL) {
if (cur->next->val < x) {
ListNode* nextNode = cur->next;
cur->next = nextNode->next; // 删除结点
resCur->next = nextNode; // 尾插法
resCur = nextNode;

} else {
cur = cur->next;
}
}
resCur->next = newHead->next;
return resHead->next;
}
};

原链表第一个结点也可能小于x,可是我们每删除一个结点都需要知道该节点的前驱结点,这时碰到了 操作头节点和其余结点不统一的情况

我们仍然是 虚拟一个前置结点,该节点指向原链表第一个节点

主要注意:

1. 我们将cur->next结点值与x进行比较,因为每删除一个结点都需要知道该节点的前驱结点

2. 每遇到一个满足要求的结点时,我们删除该节点,并尾插法插入到新的结果链表,此时 当前结点不能向前移动

比如 6-->2-->3-->8  删除小于5的结点,我们cur指向结点6,删除结点2之后,cur不能向前移动,如果移动到结点3,那么结点3就不能被删除了

3. 如果遇到的结点不满足要求,那么cur需向前移动顺序遍历

4. 遍历完之后,原链表可能有剩余结点,我们只需要使用预先的虚拟结点newHead链接上即可

4. 新的结果链表中,我们是首先 new 了一个结点,显然该结点不属于真正结果的,我们需要返回的是
resHead->next

Leetcode:Partition List 链表快速排序划分,布布扣,bubuko.com

时间: 2024-10-10 14:36:23

Leetcode:Partition List 链表快速排序划分的相关文章

LeetCode: Partition List [086]

[题目] Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example, Given 1->4->3

Partition算法及Partition算法用于快速排序

JavaScript简单方便,所以用JavaScript实现,可以在Chrome控制台下观察运行结果.主要实现Partition算法,比如输入为   var array = [4, 2, 1, 3, 6, 8, 9, 7, 5];   partition(array, 0, 8); 那么按照array[0]即4进行划分,结果为 [3, 2, 1, 4, 6, 8, 9, 7, 5] ?1. [代码][JavaScript]代码 // 先来看Partition算法,Partition算法是快速排序

单链表快速排序

根据普通快排的思路,选择1个点为中心点,保证中心点左边比中心点小,中心点右边比中心点大即可. 单链表的实现为: 1.使第一个节点为中心点. 2.创建2个指针(p,q),p指向头结点,q指向p的下一个节点. 3.q开始遍历,如果发现q的值比中心点的值小,则此时p=p->next,并且执行当前p的值和q的值交换,q遍历到链表尾即可. 4.把头结点的值和p的值执行交换.此时p节点为中心点,并且完成1轮快排 5.使用递归的方法即可完成排序 #include<iostream> #include

Leetcode:Rotate List 链表旋转

Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1->2->3->4->5->NULL and k = 2,return 4->5->1->2->3->NULL. 解题分析: 不同于数组旋转,数组可以随机存取,数组的旋转可以巧妙的 分成两两部分递归旋转 对于链表的旋转,实际上

链表快速排序

大致思想是通过一个指针数组转化为常规数组快速排序,最后再重新梳理链表. #include <iostream> #include <vector> using namespace std; typedef struct NODE{ int data; NODE* next; NODE(int _data) : data(_data), next(nullptr){} }NODE; NODE* createLinkTable() { const int tableLen = 10;

Linked List Cycle leetcode java (链表检测环)

题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 题解: 这道题连带着II是很经典的,在看CC150时候,纠结这个问题纠结了很久.在读了很多网上资料还有书的讲解以及和别人讨论之后,对这个专题终于明白了. 这一问只需要判断链表是否有环. 当链表没有环时是很好判断的,让一个指针一直往后走,遇见null了自然就没有环. 而如

[LeetCode] [Partition List 2012-04-30]

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example, Given 1->4->3->

图解精选 TOP 面试题 001 | LeetCode 237. 删除链表中的节点

题目描述 原题链接 LeetCode 237. 删除链表中的节点:https://leetcode-cn.com/problems/delete-node-in-a-linked-list 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 head =?[4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 ?5? 的第二个节点,那么在调

[LeetCode] Partition List 划分链表

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example,Given 1->4->3->2