《leetCode-php》链表内部部分反转

本文介绍了一种在链表中将指定区间[m,n]内的元素进行原地反转的算法实现,该算法仅通过一次扫描即可完成,适用于1≤m≤n≤链表长度的情况。示例展示了如何将1->2->3->4->5->NULL的链表在m=2,n=4的条件下反转为1->4->3->2->5->NULL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将一个链表m位置到n位置之间的区间反转,要求使用原地算法,并且在一次扫描之内完成反转。

例如:

给出的链表为1->2->3->4->5->NULL, m = 2 ,n = 4,

返回1->4->3->2->5->NULL.

注意:

给出的m,n满足以下条件:

1 ≤ m ≤ n ≤ 链表长度

<?php
class Node {
    public $next = null;
    public $val;
    public function __construct($val) {
        $this->val = $val;
    }
}
function reverseBetween($head, $m, $n) {
    $pre     = null;
    $rePre   = null;
    $headPre = null;
    while (true) {
        if ($m == 1) {
            if ($n == 1) {
                //反转结束点
                $headPre->next = $head;
                $pre->next     = $rePre;
                break;
            }
            //反转链表
            $next        = $head->next;
            $head ->next = $rePre;
            $rePre       = $head;
            $head        = $next;
            $n --;
        } else {
            //寻找反转链表的位置
            $m --;
            $pre     = $head;//获取m前的节点
            $head    = $head->next;
            $headPre = $head;//获取开始反转的点
        }
    }
}
$node1 = new Node(1);
$node2 = new Node(2);
$node3 = new Node(3);
$node4 = new Node(4);
$node5 = new Node(5);
$node1->next = $node2;
$node2->next = $node3;
$node3->next = $node4;
$node4->next = $node5;
reverseBetween($node1, 2, 4);
$head = $node1;
while(!is_null($head)) {
    print $head->val . "\n";
    $head = $head->next;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值