Leetcode解题-链表(2.2.3)PartitionList
题目:2.2.3 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.
代码实现
我们可以分两步解决:
1)遍历链表时,将其一分为二:第一次添加结点,即创建分区时,记住两个分区的header(par1和par2)。之后,用par1p和par2p指向分区的尾部,便于每次迭代向两个分区添加结点。
2) 链接两个分区:将分区2链接到分区1的尾部,并将分区2最后一个结点的next赋值为NULL(非常重要,后面会解释!)。
野指针引发的血案
指针par1,par2都没有初始化为NULL,而后面的if却用par1或par2是否等于NULL作为初始化par1h和par2h的条件,另外最终partition1和partition2拼接后,未将最后一个结点的改为NULL,这两个初始化问题都将导致意想不到的运行结果(产生了循环链表,打印时造成死循环)。)变量除非后面立刻赋值,否则一定要初始化;2)处理链表时,尤其是对一个链表动“大手术”时,一定要注意是不是有next值没有改,导致循环链表。
链表的典型处理方法
前面的实现中,因为初始时指针为空,所以第一次使用之前必须初始化,这使代码变得复杂化了。我们可以添加两个dummy header来简化这个问题,与实现链表的insert()和delete()时的技巧相同。Dummy分配在栈上,函数返回时将直接被回收。总结:不仅是实现链表,只要对链表做大改动,特别是要动头结点时,使用dummy header能让代码变得简洁并且不易出错。
附:二级指针实现
二级指针同样非常简洁,而且也不用在栈上分配两个dummy对象,也许速度上能更快一些。
Leetcode解题-链表(2.2.3)PartitionList的更多相关文章
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- Leetcode解题-链表(2.2.6)RotateList
1 题目:Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. Fo ...
- Leetcode解题-链表(2.2.2)ReverseLinkedList
题目:2.2.2 Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in on ...
- Leetcode解题-链表(2.2.1)AddTwoNumbers
1 题目:2.2.1 Add Two Numbers You are given two linked lists representing two non-negative numbers. The ...
- Leetcode解题思想总结篇:双指针
Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...
- LeetCode解题报告:Linked List Cycle && Linked List Cycle II
LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
- LeetCode 单链表专题 (一)
目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...
- leetcode解题报告(2):Remove Duplicates from Sorted ArrayII
描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...
随机推荐
- Go/Python/Erlang编程语言对比分析及示例
本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴 ...
- codevs 1006 等差数列
提交地址:http://codevs.cn/problem/1006/ 1006 等差数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Des ...
- 为了异常安全(swap,share_ptr)——Effecive C++
互斥锁: 假设我们要在多线程中实现背景图片的控制: class PrettyMenu{ public: -- void changeBackground(std::istream& imgSr ...
- Serpent.AI – 游戏代理框架(Python)
Serpent.AI - 游戏代理框架(Python) Serpent.AI是一个简单而强大的新颖框架,可帮助开发人员创建游戏代理.将您拥有的任何视频游戏变成一个成熟的实验的沙箱环境,所有这些都是熟悉 ...
- super 关键字
- Big Christmas Tree(poj-3013)最短路
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 25823 Accepted: 5 ...
- Golang学习笔记:channel
channel channel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任 ...
- 补充Mysql5.7用法
下面简单介绍一下安装: [root@MySQL soft]# tar xf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz -C /data/service/ [r ...
- React-报错Warning:setState(...)on anunmounted component
一.原因 这种错误一般出现在react组件已经从DOM中移除.我们在react组件中发送一些异步请求的时候,就可能会出现这样的问题.举个例子,我们在componentWillMount中 ...
- 03 持续集成和部署/基础设施 - DevOps之路
02 持续集成和部署/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi 服务的持续集成和部署这里有两套 ...