目录
1 牛客_CM11 链表分割
链接:牛客_链表分割
有很多企业真题
1.1 思路
创建2
个空链表,一个记为less
存入比x
小的节点,一个记为greater
,存入比x
大的节点,当原链表所有节点遍历完,链接less / greater
两个链表,合成一个,即可返回
1.1.1 过程
1.1.2 实现
struct ListNode* partition(struct ListNode* pHead, int x) { // 创建4个指针,作为2种方法的头和尾 struct ListNode* lessHead, * lessTail, * greaterHead, * greaterTail, * cur; cur = pHead; // 创建哨兵位头结点,以便尾插 lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode)); lessTail->next = NULL; greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode)); greaterTail->next = NULL; while (cur) { if (cur->val < x) { lessTail->next = cur; lessTail = cur; } else { greaterTail->next = cur; greaterTail = cur; } cur = cur->next; } lessTail->next = greaterHead->next; // 保存哨兵位的next,并free greaterTail->next = NULL; // 最后把 大的链表链接到小的尾部,不过会带有原先后面的,就是成环了,所以要把最后一个的next置空 struct ListNode* newHead = lessHead->next; free(lessHead); free(greaterHead); return newHead; }
1.2 注意
-
使用哨兵位记得返回
next
并free
-
最后会成环,记得最后一个
tail
的next
置空