Partition List

本文介绍了一种链表分区算法,用于将链表中的节点根据给定值x进行分割,使得所有小于x的节点位于前半部分,大于等于x的节点位于后半部分,同时保持原始顺序。通过使用哨兵节点,该算法解决了链表末尾节点的处理问题,并确保了操作的效率和正确性。

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.

 

用了哨兵之后,能够回避很多问题。在此需要注意的问题是,对于链表最后一个元素,应该考虑他是否大于等于x。之前偷懒没有处理这个元素,但是题意要求保持原顺序。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        ListNode *gard = new ListNode(0);
        ListNode *par = new ListNode(x);
        ListNode *pp = par;
        gard->next = head;
        ListNode *pre = gard;
        
        ListNode *temp = head;
        if(head == NULL) return head;
        
        while(temp -> next != NULL)
        {
            if(temp -> val >=x)
            {
                pre -> next = temp ->next;
                temp ->next = NULL;
                pp->next = temp;
                pp = pp->next;
                temp =pre->next;
            }
            else
            {
                pre =pre->next;
                temp = temp->next;
            }
        }
        if(temp -> val >=x)
        {
            pp->next = temp;
            pre->next = NULL;
            temp =pre;
        }
        temp ->next = par ->next;
        
        return gard->next;
    }
};

  

转载于:https://www.cnblogs.com/pengyu2003/p/3605039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值