题目链接:https://leetcode.com/problems/partition-list/description/

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.

Example:

Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5

思路:

  • 根据题目所述,要求将链表中小于x(< x )的结点放在链表的左侧,大于等于x(>= x)的结点放置在链表的右侧;并且要求元素的相对顺序保持不变。
  • 最直观的想法就是遍历链表,将元素中大于等于x(>= x)的结点拎出来,组成一个新的链表;当对原始链表遍历完成后,将拎出来的新链表插入到处理后的原始链表的后面即可。

  注意:上面描述的是将大于等于x(>= x)的结点拎出来,也可将小于x(< x)的结点拎出来,两者处理过程基本一样。只是组合成所求链表时插入位置不同。

编码如下

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (head == nullptr) return head; // 链表为空,则直接返回 // 操作原始链表的准备工作
// 包括创建一个辅助结点指向链表的头结点
ListNode *pHead = new ListNode(-);
pHead->next = head;
ListNode *pre = pHead; // pre指向遍历到的结点的前驱结点
ListNode *cur = head; // cur指向遍历到的当前结点(即待处理结点) // 创建指向大于等于x(>= x ) 结点的链表
// 用pNew指针指向该链表的头结点,pNew为辅助结点
ListNode *pNew = new ListNode(-);
ListNode *ptrNew = pNew; // 对原始链表进行遍历
while (cur != nullptr)
{
if (cur->val >= x) // 将原始链表中大于等于x(>= x)的结点分离出来,形成新的链表
{
ListNode *pTemp = cur;
pre->next = pTemp->next;
cur = cur->next; ptrNew->next = pTemp;
ptrNew = ptrNew->next;
ptrNew->next = nullptr;
}
else // 对于原始链表中小于x(< x)的结点,移动指针指向即可。
{
pre = cur;
cur = cur->next;
}
} // 将两部分连接起来
// 将原始链表中小于x(< x)的部分和原始链表中大于等于x(>= x)的部分连接起来
pre->next = pNew->next;
head = pHead->next; // 释放辅助结点内存空间
delete pHead;
delete pNew; return head;
}
};

最新文章

  1. Thinking in Unity3D:材质系统概览
  2. 一张图告诉你,只会HTML还不够!
  3. 宏碁台式机,如何设置u盘启动
  4. 挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup
  5. Ubuntu安装出现左上角光标一直闪解决方式
  6. 升级vs工程到vs2010(以上)工程找不到OutputDebugStr报错
  7. 《慕客网:IOS-动画入门》学习笔记
  8. [BZOJ 1483][HNOI 2009]梦幻补丁(有序表启发式合并)
  9. JavaScript - prototype 和 call 的理解
  10. mysql procedure返回多数据集
  11. hdu_5950_Recursive sequence(矩阵快速幂)
  12. JAVA上传与下载
  13. IT连创业系列:说说苹果商店AppStore上架App应用前后遇到的那些神坑
  14. spring集成shiro登陆流程(下)
  15. Java——IO流 对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
  16. SpringBoot(11) SpringBoot自定义拦截器
  17. Robotics Tools
  18. Status: Checked in and viewable by authorized users 出现在sharepoint 2013 home 页面
  19. vue2之对象属性的监听
  20. js formData图片上传(单图上传、多图上传)后台java

热门文章

  1. sql关联查询更新速度慢的问题
  2. gitlab qq邮件配置
  3. 题解 【NOIP2010】关押罪犯
  4. Codeforces 838E Convex Countour
  5. expect无交互操作
  6. k8s知识1
  7. Codeforces 965 D. Single-use Stones(思维)
  8. Vue_(基础)Vue中的事件
  9. FRP
  10. echarts热力地图