【超详细】c语言实现链表分割

题目链接:链表分割_牛客题霸_牛客网

本题目在牛客网难度为较难,但是在整理思路画图后,题目难度并不大,下面说说我的思路

假设我们这里有一个链表为:2,3,5,1,7,2,然后找比4小的数字放在前面,比4大的数字放在后面,并且不改变原来的顺序,所以得出结果为:2,3,1,2,5,7

上来我们的链表应该是这样:

然后我们定义带哨兵卫的2个节点(用来保存小于4的节点和大于4的节点)

 【超详细】c语言实现链表分割_第1张图片

最后把2个链表连接起来(记住bigTail要置空并且smallTail->next指向为bigHead的下一个)

 【超详细】c语言实现链表分割_第2张图片

 代码如下:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct ListNode* cur=pHead;
        //保存小于x的值
        struct ListNode* smallHead=(struct ListNode*)malloc(sizeof(struct ListNode));
        smallHead->next=NULL;
        struct ListNode* smallTail=smallHead;
        //保存大于x的值
        struct ListNode* bigHead=(struct ListNode*)malloc(sizeof(struct ListNode));
        bigHead->next=NULL;
        struct ListNode* bigTail=bigHead;
        while(cur)
        {
            if(cur->valnext=cur;
                smallTail=smallTail->next;
            }
            else
            {
                bigTail->next=cur;
                bigTail=bigTail->next;
            }
            cur=cur->next;
        }
        //这里置空不能忘记,一开始我就没想到
        bigTail->next=NULL;
        smallTail->next=bigHead->next;
        free(bigHead);
        struct ListNode* copysmallHead=smallHead->next;
        free(smallHead);
        return copysmallHead;
    }
};

你可能感兴趣的:(单链表,链表,数据结构)