每日一题:Java实现单向链表的反转

导读:本篇文章讲解 每日一题:Java实现单向链表的反转,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一.问题的分析

实现单向链表的反转其实就是将链表的最后一个结点放在第一位,将倒数第二个节点放在第二位,以此类推.

我们学过链表的的两种插入节点的方法,一种是头插法,一种是尾插法,刚好这两种方式插入的时候结点的顺序正好是相反的,相当如将头插法按尾插法的方式插入,正好就是可以实现链表的插入

二.创建结点

class DataNode {
    public Integer id;
    public DataNode next;

    public DataNode(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "DataNode{" +
                "id=" + id +
                '}';
    }
}

三.创建单链表

class SingleLinkedList {
    private DataNode head = new DataNode(0);

    public DataNode getHead() {
        return head;
    }

    //添加链表(尾插法)
    public void add(DataNode newNode) {
        DataNode temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = newNode;
        head.id++;

    }

    //添加链表(头插法)
    public void addByHead(DataNode newNode) {
        newNode.next = head.next;
        head.next = newNode;
        head.id++;

    }


    //遍历节点
    public void list() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        System.out.println("此链表共有" + head.id + "个结点");
        DataNode temp = head;
        while (temp.next != null) {
            temp = temp.next;
            System.out.println(temp);
        }


    }
}

四.实现方法

public class LinkListDemo {
    public static void main(String[] args) {
        SingleLinkedList list = new SingleLinkedList();
        list.addByHead(new DataNode(1));
        list.addByHead(new DataNode(4));
        list.addByHead(new DataNode(6));
        list.addByHead(new DataNode(9));
        list.list();
        reverse(list.getHead());
        list.list();

    }
    
     public static void reverse(DataNode head) {
        if (head.next == null || head.next.next == null)
            return;
        DataNode reverseHead = new DataNode(0);
        DataNode temp = head.next;
        DataNode insertNode=temp;
        while (temp != null) {
            temp = temp.next;
            insertNode.next = reverseHead.next;
            reverseHead.next = insertNode;
            insertNode = temp;

        }

        head.next = reverseHead.next;


    }
}

五.输出结果

此链表共有4个结点
DataNode{id=9}
DataNode{id=6}
DataNode{id=4}
DataNode{id=1}
——————————-
此链表共有4个结点
DataNode{id=1}
DataNode{id=4}
DataNode{id=6}
DataNode{id=9}

 六.分析与注意点

当进行链表反转的时候,首先要判断链表是否为空,或者链表仅含有一个结点的时候,此时链表不需要反转,或者无法反转,程序停止.

因为要反转一个链表,并且采用头插法的形式进行插入节点,所以第一步应该是把所有的结点全部都拿出来,然后进行头插法的插入到一个新的头结点.

此时形成一个新的链表为的头结点为reverseHead,此时我们需要考虑的就是如何将reverseHead

“嫁接”到以head为头结点的链表,如何直接令head=reverseHead,(存在于栈中)当方法没有结束的时候,遍历链表,此时是满足要求的,但是当方法结束的时候,head指向的地址仍然是原来的地址,链表并没有发生反转,答案是错误的.那么我们应该考虑的是如何使head的地址不发生改变,使得head可以是反转链表的头结点呢,如果head.next指向reverseHead.next,此时由于是存在于堆之中的,当方法结束的时候,并没有发生改变,head.next的地址仍然是指向reverseHead.next的,此时便可以成功的完成.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/101084.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!