题目描述:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
1.新建一个空节点指向头结点,因为可能头结点比x大,所以在head前要插入小的,不然无法插入
2.first指针指向新建空节点,遍历first.next,寻找一个节点,它的值比x小,它的next值比x大。往后比x小的值都插入在first节点的后面。(一开始考虑到first指针在插入之后初始化指向空节点,因为考虑比x小的点插入前面的时候保证是有序的,所以运行的时候Time Out了,其实只要按照保证每个节点的相对顺序,不需要排序)
3.插入的时候,首先需要一个指针指着待插的节点,然后待插节点的前一个节点的next是待插节点的next,在插入的时候,要先保证待插节点的next指向first节点的next,如果先执行first.next为待插节点,那么待查节点就无法找到本来first节点的next.
class Solution:
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
tempNode=ListNode(None)
#新建一个节点指向头结点,因为如果头结点比x大,那么比x小的节点就无法插入head之前
tempNode.next=head
first=tempNode
if head==None:
return None
if head.next==None:
return head
while (first.next)and(first.next.val<x):
#找到第一个比x小,next比x大的点,往后的点都插入在后面
first=first.next
second=first.next#从first节点后开始扫描,first节点前都比x小
if second==None:
return head#如果first.next为空,说明整个链表的值都比x小
else:
while second.next:
if second.next.val>=x:
second=second.next
else:#当找到一个值比x小时
temp=second.next#提取该节点
second.next=second.next.next
temp.next=first.next
first.next=temp#上面一行与这一行代码不能互换
first=first.next
return tempNode.next
周六颓废了一天,所有的事都堆到周末。