分割链表@Nowcoder —— 单链表

小题解

  • 1. 题目
  • 2. 思路及小注意点
  • 3. 题解
  • 4. 反思

1. 题目

题目链接:分割链表
在这里插入图片描述

2. 思路及小注意点

这道题目的经典思路,就是创建两个新链表lessHeadmoreHead,各自尾插再链接即可。
分割链表@Nowcoder —— 单链表_第1张图片

小注意点

  • 这道题目的经典错误,就是greaterHead这条链表经历了一系列尾插之后,尾巴没置空。由于还可能与原链表中其后节点相连,实际上成环了。这点我注意到了。
    分割链表@Nowcoder —— 单链表_第2张图片
  • 但也拦不了我这个智障晕的乎的把lessTailgreaterTail给成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. 反思

最朴素的思路无非是,为了保证数据顺序不变,创建一个新头结点,遍历链表把小的尾插(要找尾),同时不断缝合原链表(要记录prevnext),并且要找的到原链表的头,最后链接过来,一顿操作猛如虎,发现我是二百五。这种做法相当麻烦,最后还是回归了经典解法,创建两条新链表。

⭐️ After all this time?
Always.

持续更新~@边通书

你可能感兴趣的:(数据结构经典题解,链表,数据结构)