086. Partition List
Posted ming-1012
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了086. Partition List相关的知识,希望对你有一定的参考价值。
题目链接: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)的结点拎出来,两者处理过程基本一样。只是组合成所求链表时插入位置不同。
编码如下:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* partition(ListNode* head, int x) { 12 if (head == nullptr) return head; // 链表为空,则直接返回 13 14 // 操作原始链表的准备工作 15 // 包括创建一个辅助结点指向链表的头结点 16 ListNode *pHead = new ListNode(-1); 17 pHead->next = head; 18 ListNode *pre = pHead; // pre指向遍历到的结点的前驱结点 19 ListNode *cur = head; // cur指向遍历到的当前结点(即待处理结点) 20 21 // 创建指向大于等于x(>= x ) 结点的链表 22 // 用pNew指针指向该链表的头结点,pNew为辅助结点 23 ListNode *pNew = new ListNode(-1); 24 ListNode *ptrNew = pNew; 25 26 // 对原始链表进行遍历 27 while (cur != nullptr) 28 { 29 if (cur->val >= x) // 将原始链表中大于等于x(>= x)的结点分离出来,形成新的链表 30 { 31 ListNode *pTemp = cur; 32 pre->next = pTemp->next; 33 cur = cur->next; 34 35 ptrNew->next = pTemp; 36 ptrNew = ptrNew->next; 37 ptrNew->next = nullptr; 38 } 39 else // 对于原始链表中小于x(< x)的结点,移动指针指向即可。 40 { 41 pre = cur; 42 cur = cur->next; 43 } 44 } 45 46 // 将两部分连接起来 47 // 将原始链表中小于x(< x)的部分和原始链表中大于等于x(>= x)的部分连接起来 48 pre->next = pNew->next; 49 head = pHead->next; 50 51 // 释放辅助结点内存空间 52 delete pHead; 53 delete pNew; 54 55 return head; 56 } 57 };
以上是关于086. Partition List的主要内容,如果未能解决你的问题,请参考以下文章