LeetCode 之 Partition List

原题:

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.

以后看到这种题需要注意:要加一个节点,指向head我这里用的是pre和result,有比x小de节点都插在pre后面,最后返回的是result。

有这个情况需要注意,由于移动一个节点,需要其改变其前驱的next指针,因此我这里主要就是探测current->next,如果这个current->next的值小于x,就把这个节点插在pre的后面,然后current和pre移动,这里有一种特殊情况:

当pre和current不是一个时,由于current后面的节点被移走,相当于自动进行了current=current->next;当两个节点一致时,需要手动调节,如图:


代码如下(36ms):

class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        ListNode* pre = new ListNode(0);
        pre->next = head;
        ListNode * result = pre;
        
        ListNode * current = pre;
        while(current&¤t->next){
            
            if(current->next->val < x ){
                if(pre==current){
                    pre = pre->next;
                    current = current->next;
                    continue;
                }
                ListNode * move = current->next;
                current->next  = move->next;
                move->next = pre->next;
                pre->next = move;
                pre = pre->next;
            }
            else current = current->next;
        }
        return result->next;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值