java单链表反转

java 单链表反转

因为面试考到了一些算法,也都忘的差不多了,学习了单链表之后,想把内容下来。这篇文章主要介绍什么是单链表以及单链表的反转方式:

链表定义

链表是一种递归的数据结构,它或者为空(null),或者是指向一个结点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链表的引用。

我的理解就是:链表是由一个一个的结点组成,结点呢,是由一个元素和一个指向另一个结点的引用组成。举个例子,火车就好比一条链表,一节一节的车厢就是结点。车厢里面的人就是结点中存在的元素,1号车厢连接2号车厢即1个结点指向下一个结点。

结点抽象成代码就是:

private class Node{
    Item item;
    Node next;
}

一个Node对象包含两个实例变量,类型分别为Item(参数类型)和Node。
我们通过new Node()触发构造函数来创建一个Node类型的对象。调用的结果是一个指向Node对象的引用,它的实例变量均被初始化为null。

如何定义一个节点:

private class Node{
    int data;//数据域 ,(参数类型为int)
    Node next;//指针域
    //传数据域的构造函数
    public Node(int data) {
        this.data = data;
     }
    //省略get set
    ...
}

如何反转单链表

1.递归反转
递归反转的思想:
在反转一个结点前先反转下一个结点,将尾结点作为头结点。

实现代码:

public class Reverse {
    public static void main(String[] args){
        Node head = new Node(0);//第一个结点,即头结点
        Node node1 = new Node(1);//头结点之后的第一个结点
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node tail = new Node(4);//尾结点
        //设置指针域
        head.setNext(node1);
        node1.setNext(node2);
        node2.setNext(node3);
        node3.setNext(tail);

        //从头结点开始循环打印
        Node node = head;
        while (node!=null){
            System.out.println(node.getData());
            node = node.getNext();
        }

        head = reverse(head);

        System.out.println("反转后的打印结果");
        while (head!=null){
            System.out.println(head.getData());
            head = head.getNext();
        }
    }
    //递归反转
    public static Node reverse(Node head){
        // head看作是前一结点,
        // head.getNext()是当前结点
        // reHead是反转后新链表的头结点
        if (head == null || head.getNext() == null) {
            // 若为空链或者当前结点在尾结点,则直接还回
            return head;
        }
        Node last = reverse(head.getNext());// 先反转head的下一个结点
        head.getNext().setNext(head);// 将当前结点指向前一结点
        head.setNext(null);// 前一结点的指针域令为null;
        return last;// 反转后新链表的头结点
    }

}

2.非递归反转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值