【牛客刷题】——链表分割

链表分割

  • 题目描述
  • 思路分析
  • 代码实现

题目描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针

思路分析

  1. 我们令cur=pHead
  2. 让cur遍历链表,再开辟两个新结点lessHead和greaterHead,把链表分为两部分,第一部分是小于x的结点放在lessHead->next里,大于x的结点放在greaterHead->next里
  3. 当cur走到NULL时,让lessTail->next=greaterHead->next,这样就把两个链表按照原来的相对顺序连接起来
  4. 返回lessHead->next.

代码实现

 ListNode* partition(ListNode* pHead, int x) {
    struct ListNode* lessHead,*greaterHead;
    struct ListNode *lessTail=NULL,*greaterTail=NULL;
     lessHead=lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
    greaterHead=greaterTail=(struct ListNode*)malloc(sizeof(struct ListNode));
     struct ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                lessTail->next=cur;
                lessTail=cur;
                cur=cur->next;
            }
            else
            {
                greaterTail->next=cur;
                greaterTail=cur;
                cur=cur->next;
            }
        }
        greaterTail->next=NULL;
        lessTail->next=greaterHead->next;
        struct ListNode* head= lessHead -> next;
        return head;
        
        
        
}

你可能感兴趣的:(数据结构,c语言)