0、题目描述
链表分割
这道题的思路,遍历原链表,小于x的放到一个链表里,大于x的放到另一个链表里。然后把两个链表接起来。
建立的两个新链表都是有哨兵位的,也就是有头结点,排序结束后要free两个头结点。
1、法1
还是三个指针一起走,比x小的放到smailhead里,比x大的放到bighead里。这三个指针分别是smailtail,bigtail,cur
注意要在循环结束之后,最后一个节点的指针要置空,否则就会形成环。
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {//初始化两个带哨兵位头结点的链表,smailhead和bigheadListNode* smailhead, *smailtail, *bighead, *bigtail;smailhead = smailtail = (ListNode*)malloc(sizeof(ListNode));bighead = bigtail = (ListNode*)malloc(sizeof(ListNode));smailhead->next = nullptr;bighead->next = nullptr;ListNode* cur = pHead;//遍历原链表while (cur){if (cur->val < x){smailtail->next = cur;smailtail = smailtail->next;}else {bigtail->next = cur;bigtail = bigtail->next;}cur = cur->next;}//防止形成环bigtail->next = nullptr;//链接两个链表smailtail->next = bighead->next;pHead = smailhead->next;free(smailhead);free(bighead);return pHead;}
};