题目分析:
- 给定一个单链表和一个整数x,把链表中小于x的节点放在链表前部分,把链表中大于等于x的节点放在链表的后部分,每部分节点之间相对原始的位置保存不变。
解题思路:
遍历实现
1)定义两个链表的空表头,head1和head2;
2)将小于x的节点依次挂接在head1对应的链表表尾;
3)将大于等于x的节点依次挂接在head2对应的链表表尾;
4)将head1的表尾与head2的表头进行连接,返回head1即可。
实现程序
ListNode *partition(ListNode *head, int x) { // 空链表处理 if (head == NULL) return NULL; // 定义两个新链表的表头head1和head2 struct ListNode *head1 = (struct ListNode *) malloc (sizeof(struct ListNode)); struct ListNode *head2 = (struct ListNode *) malloc (sizeof(struct ListNode)); struct ListNode *p1 = head1; struct ListNode *p2 = head2; // 一遍遍历整个链表 while (head != NULL) { // 当前节点值小于x,则将当前节点挂接在head1的尾端 if (head->val < x) { p1->next = head; p1 = head; head = head->next; } // 当前节点大于等于x,则将当前节点挂接在head2的尾端 else { p2->next = head; p2 = head; head = head->next; } } // 将head2的尾指针指向NULL p2->next = NULL; // 将链表head1尾端与链表head2的头部相接 p1->next = head2->next; // 返回最终的链表 return head1->next; }