在这里插入代码片
## 链表划分
问题描述
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
- 解题思路:
把大于x和小于x的节点分别存放在两个链表里,然后在拼接起来
tips
- 巧用临时头结点:
设置一个临时头结点,就无须定位两个头结点的头,返回时只需返回头结点的next即为我们所需要的链表。 - 记住给最后一个节点的next置空
class Solution:
def partition(self, head: ListNode, x: int) -> ListNode:
dummy1 = ListNode(-1)
dummy2 = ListNode(-1)
p1 = dummy1
p2 = dummy2
while head:
if head.val < x:
p1.next = head
p1 = p1.next
else:
p2.next = head
p2 = p2.next
head = head.next
p1.next = dummy2.next
p2.next = None
return dummy1.next
c++实现:
/**
* 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) {
ListNode less_head(0);
ListNode more_head(0);
ListNode* less=&less_head;
ListNode* more=&more_head;
while (head){
if (head->val<x){
less->next=head;
less=head;
}
else{
more->next=head;
more=head;
}
head=head->next;
}
less->next = more_head.next;
more->next = NULL;
return less_head.next;
}
};
Tips:
- 当访问地址(指针或迭代器)的成员或数据时,用“->”
- 当访问直接对象的成员或数据时,用“.”