@TOC
1. 题目
题目链接:分割链表
2. 思路及小注意点
这道题目的经典思路,就是创建两个新链表lessHead
和moreHead
,各自尾插再链接即可。
小注意点
- [ ] 这道题目的经典错误,就是
greaterHead
这条链表经历了一系列尾插之后,尾巴没置空。由于还可能与原链表中其后节点相连,实际上成环了。这点我注意到了。
- [ ] 但也拦不了我这个智障晕的乎的把
lessTail
和greaterTail
给成pHead
。
3. 题解
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
if(pHead == NULL)
return NULL;
struct ListNode* lessHead,*lessTail;
lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));
struct ListNode* greaterHead,*greaterTail;
greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
struct ListNode* cur = pHead;
while(cur)
{
if(cur->val < x)
{
lessTail->next = cur;
lessTail = cur;
}
else
{
greaterTail->next = cur;
greaterTail = cur;
}
cur = cur->next;
}
lessTail->next = greaterHead->next;
greaterTail->next = NULL;
struct ListNode* ret = lessHead->next;
free(lessHead);
free(greaterHead);
return ret;
}
};
4. 反思
最朴素的思路无非是,为了保证数据顺序不变,创建一个新头结点,遍历链表把小的尾插(要找尾),同时不断缝合原链表(要记录prev
和next
),并且要找的到原链表的头,最后链接过来,一顿操作猛如虎,发现我是二百五。这种做法相当麻烦,最后还是回归了经典解法,创建两条新链表。
:star: After all this time?
:black_heart: Always.
持续更新~@边通书