问题描述:
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。应该保留两部分内链表节点原有的相对顺序。
样例:给定链表 1->4->3->2->5->2->NULL,并且x=3
返回 1->2->2->4->3->5->NULL。
实现思路:
先创建两个头节点leftDummy和rightDummy,定义两个指针变量left和right。初始时,这两个指针变量分别指向两个头结点。从原链表的第一个节点head开始,如果节点的值比给定的值大,那么指针变量right->next的指向该节点,然后head后移一个节点(head=head->next)。否则,指针变量left->next指向该节点,然后head后移一个节点。(head=head->next)。当遍历完原链表的所有节点之后,连接两个链表。
代码:
ListNode *partition(ListNode *head, int x) {
if (head == NULL) {
return NULL;
}
ListNode *leftDummy = new ListNode(0);
ListNode *rightDummy = new ListNode(0);
ListNode *left = leftDummy, *right = rightDummy;
while (head != NULL) {
if (head->val < x) {
left->next = head;
left = head;
} else {
right->next = head;
right = head;
}
head = head->next;
}
right->next = NULL;
left->next = rightDummy->next;
return leftDummy->next;
}
感想:
不改变链表节点的原有相对顺序,只有逐个读取连表中的节点逐个放。对于链表节点的划分,划分成几部分就创建几个链表然后再连接起来。