实现链表反转的2种方法

解题思路

1:头节点插入法
创建一个新的链表,然后循环旧链表并使用头插法插入数据到新的链表,完成后便是一个反转的链表
头节点插入图解

2:原地反转
头结点插入法的实质是重新创建了一个新的链表,通过遍历待反转链表,将链表每一个节点插入到创建的链表中,然后的到的这个创建的链表就是反转后的链表。而就地反转实质就是在待反转链表基础上修改节点顺序得到反转链表。
原地反转图解

边界条件

1:链表为空
2:链表只有一个元素

代码实现

建立在这篇博客的基础上php实现链表

$tmpLinkList = new LinkList(); 
//头插法反转
public function reversal($tmpLinkList) {
    $tmpPrev = $tmpLinkList->head;
    $prev = $this->head->next;
    if($prev == null){
        echo "链表为空"."\n";
        return;
    }

    if($prev->next == null){
        echo "链表只有一个元素"."\n";
        return;
    }

    while($prev != null) {
       $val = $prev->val;
       $prev = $prev->next; 
       $tmpPrev->next = new Node($val, $tmpPrev->next);         
    }

    $this->head = $tmpPrev;
}

//原地反转
public function reversalInPlace() {
    $prev = $this->head->next; 
    if($prev == null){
        echo "链表为空"."\n";
        return;
    }

    if($prev->next == null){
        echo "链表只有一个元素"."\n";
        return;
    }

    $pNext = $prev->next;
    $tmp = null;
    while($pNext != null) {
        $tmp = $pNext->next;
        $pNext->next = $prev;
        $prev = $pNext;
        $pNext = $tmp;
    }

    //此时pNext指向原始链表最后一个元素,也是逆转后的链表的表头元素
    $this->head->next->next = null; //设置链表尾
    $this->head->next = $prev; //调整链表头
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值