链表的反转

这篇博客介绍了两种链表反转的方法:栈和插入法。栈方法利用元素先入后出的特性,遍历链表并压栈,再依次弹出得到反转链表。插入法则是通过创建新链表,每次将原链表元素插入到新链表头部。两种方法各有特点,但作者更倾向于使用栈方法,认为其思路清晰。
摘要由CSDN通过智能技术生成

链表的反转

在做一些题的时候需要将链表进行反转。一般有两种方法,使用栈和插入法。
1.栈:由于栈的特点是元素先入后出,那么将链表的元素压栈后再弹出就得到了反序。
代码如下:


    public ListNode ReverseList(ListNode head) {
        Stack<ListNode> stack = new Stack<>();
        //遍历链表元素,并将个元素压栈
        while (head!=null){
            stack.push(head);
            head = head.next;
        }
        //判断是否是空表
        if(stack.size()==0){
            return null;
        }
        //记录第一个元素,头节点
        head = stack.pop();//作为返回的元素,不动他了,后续处理就用另外temp变量来解决
        ListNode temp = head;//这一步是应该注意的,我第一次写成了ListNode temp = head.next
        //我想的是指向head的next,但是没用,因为头节点还没有处理完毕,他的next还没有赋值,需要指向头节点。
        while (stack.size()!= 0){
            temp.next = stack.pop();
            temp = temp.next;
        }
        temp.next = null;

        return head;
    }

2.使用插入法,将后续出来的元素作为新的顺序链表的表头。如图
在这里插入图片描述
在这里插入图片描述
图片来源牛客网的题解。
说白了就是按顺序取出每一个元素,取出的元素作为新链表的表头。
代码如下:

public class Solution {
    public ListNode ReverseList(ListNode head) {
    //创建新表头,并且遍历链表元素表头都会更新为当前链表元素
        ListNode newHead = null;
        //使用ln指向表头
        ListNode ln = head;
        //遍历链表
        while (ln!=null){
        //首先保存下一个节点的值
            ListNode temp = ln.next;
            //将原表头插入到当前元素后面
            ln.next = newHead;
            //更新新表头为当前元素
            newHead = ln;
            //ln指向原链表中的下一个元素,继续遍历
            ln = temp;
        }
        return newHead;
    }
}

PS:虽然第二种方法看起来要短,但我更喜欢使用栈来做,因为思路清晰得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值