如何实现链表的逆序打印之插入法(带头结点)

本篇采用“插入法”来解决这个问题

先给出链表结构:

public class LNode {
    int data;
    LNode next;
}

插入法就是从链表的第二个节点开始,依次插入到head头的下一个引用上,并把第一个节点作为整个链表的尾部,即将它的下一个节点引用设置为null.

具体操作如下,假如我们有head->1->2->3->4->5这样一个链表:

  1. 先设置当前节点为第二个节点,并将节点1的下一个引用置为null;
cur = head.next.next;       //当前节点
head.next.next = null;		//将

在这里插入图片描述

在这里插入图片描述

  1. 将节点2的下一个引用设置为1

    在这里插入图片描述

  2. 将head的下一个引用设置为2
    在这里插入图片描述

  3. 将cur指针后移,以此类推完成上述的插入操作

之后的3,4,5三个元素依次插入head的尾部,即可实现链表逆序。

Java代码如下:

/**
 * @author F3ver1
 * @Description 插入法,从链表第二个元素开始,插入到head尾部,并把第一个节点作为整个链表的尾
 * @date 2019/4/14 19:42
 */
public class Main {
    public static void reverse(LNode head) {
        if (head == null || head.next == null) {
            return;
        }
        LNode cur = null;
        LNode next = null;
        cur = head.next.next;
        head.next.next = null;
        //head-->1-->2-->3-->4
        //head-->2-->1-->3-->4
        while (cur != null) {
            //这步是为了记录下个节点的值
            next = cur.next;
            //上述图中的几步操作
            cur.next = head.next;
            head.next = cur;
            cur = next;
        }
    }

    public static void main(String[] args) {
        LNode head = new LNode();
        head.next = null;
        LNode tmp = null;
        LNode cur = head;
        //构造单链表
        for (int i = 1; i <= 5; i++) {
            tmp = new LNode();
            tmp.data = i;
            tmp.next = null;
            cur.next = tmp;
            cur = tmp;
        }
        for (cur = head.next; cur != null; cur = cur.next) {
            System.out.print(cur.data + " ");
        }
        reverse(head);
        System.out.print("\n");
        for (cur = head.next; cur != null; cur = cur.next) {
            System.out.print(cur.data + " ");
        }
    }
}

结果输出:

1 2 3 4 5
5 4 3 2 1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值