单链表的反转:腾讯面试题

对于单链表的反转我们这里提供三个方法供大家参考
1.头插法
2.利用Stack栈(先进后出)
3.递归实现【和2方法类似,都是通过栈这个数据结构来实现】

一丶头插法

思路:创建一个新的 new_head 指针 用来记录返回反转后的单链表的头指针。遍历原先的链表,每遍历到一个元素Node,将其插入到 new_head 指针的前面【】,再让 new_head 指针指向新插入的节点【Node】,以此类推……实现了单链表的反转

    //反转代码
    public Node reserve(){
        Node reserve_head=new Node("");
        //用来保存每遍历一次节点后的下一个节点
        Node next=null;
        Node temp=head.next;
        while (temp!=null){
            next = temp.next;         
            temp.next = reserve_head.next;
            reserve_head.next = temp;

            temp = next;
        }
        reture reserve_head.next;
    }
二丶利用Stack栈(先进后出)

可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进先出的特点,就实现了逆序打印的效果
代码如下:

public static void reservePrint(HeroNode head){
    HeroNode temp = head.next;
    Stack<String> stack = new Stack();
    while(temp!=null){
        stack.push(temp);             //压栈
        temp=temp.next;
    }
    while(stack.size()>0{        //出栈
        System.out.println(stack.pop());          //Stack栈的特点是先进后出
    }
}
二丶递归实现反转

对于整个链表的反转,我们可以分解为多个规模小的节点的反转

代码如下:

    private Node Reverses(Node head){
        // 递归到最后一个节点,返回新的新的头结点
        if (head==null||head.next == null) {
            return head;
        }
        //得到第一个之后返回的新节点的头,因此后面的代码只需要完成
        //第 1 个节点的反转即可,因为head.next依然指向第 2 个节点
        Node newHead = Reverses(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

践行~渐远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值