栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

反转单向链表、倒序打印列表(使用栈)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

反转单向链表、倒序打印列表(使用栈)

链表和节点类
//链表
class linkedList {

    private Hero head = new Hero(0, "");

    //直接添加到链表尾部
    public void add(Hero hero) {
        //头节点不可以变化,所以借助临时节点
        Hero temp = head;
        //找到最后一个节点
        while (temp.getNext() != null) {
            temp = temp.getNext();
        }
        //设置最后一个节点的后一个节点
        temp.setNext(hero);
    }

    //按照英雄的编号排列
    public void addByOrderNo(Hero hero) {
        Hero temp = head;
        //查看传入的英雄是否存在
        boolean flag = false; //默认不存在
        while (true) {
            if (temp.getNext() == null) {
                //说明到最后一个了,直接在最后添加
                break;
            }
            if (temp.getNext().getNo() > hero.getNo()) {
                //下一个的no大于当前传入的no,所以放在temp和temp.next之间
                break;
            }
            if (temp.getNext().getNo() == hero.getNo()) {
                //相等说明,当前英雄已存在
                flag = true;
                break;
            }
            temp = temp.getNext();
        }
        //判断是否存在
        if (flag) {
            //存在
            System.out.printf("当前英雄已存在,英雄id为:" + hero.getNo());
        } else {
            //不存在
            //将temp的next赋值给hero的next
            hero.setNext(temp.getNext());
            //将hero赋值给temp的next
            temp.setNext(hero);
        }

    }

    public Hero getHead() {
        return head;
    }

    public void print() {
        if (head.getNext() == null) {
            System.out.println("没有内容~");
            return;
        }
        Hero temp = head;
        while (true) {
            temp  = temp.getNext();
            System.out.println(temp);
            if (temp.getNext() == null) {
                return;
            }
        }
    }

}

//节点
class Hero {
    //英雄编号
    private int no;
    //姓名
    private String name;
    //指向的下一个英雄
    private Hero next;

    public Hero(int no, String name) {
        this.no = no;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "no=" + no +
                ", name='" + name + ''' +
                '}';
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Hero getNext() {
        return next;
    }

    public void setNext(Hero next) {
        this.next = next;
    }
}
反转单向链表      思路:
  1. 定义一个零时头指针
  2. 依次从链表中取出一个节点,放在临时头指针的后面
public static void reverselinkedList(Hero head) {
    //若链表只有一个或零个则直接返回
    if (head.getNext() == null || head.getNext().getNext() == null) {
        return;
    }
    //临时头部,表示反转之后的头部
    Hero tempHead = new Hero(0, "");
    Hero first = head.getNext();
    Hero next = null; //第一个的后一个
    while (first != null) {
        //保留下一个英雄
        next = first.getNext();
        //修改要放入反转链表的next属性为原来反转链表的第一个英雄
        first.setNext(tempHead.getNext());
        //修改反转链表头中的next属性
        tempHead.setNext(first);
        //指向下一个英雄
        first = next;
    }
    //修改头
    //head = tempHead;(x) 只是将地址给了head,内容没有发生改变
    head.setNext(tempHead.getNext());
}

 倒序打印链表(使用栈)
public static void reversePrint(Hero head) {
    if (head.getNext() == null) {
        System.out.println("链表为空");
        return;
    }
    Stack stack = new Stack<>();
    Hero temp = head.getNext();
    //入栈
    while (temp != null) {
        stack.push(temp);
        temp = temp.getNext();
    }
    //出栈
    while (stack.size() > 0) {
        System.out.println(stack.pop());
    }
}

从B站韩顺平老师的Java数据结构与算法习得。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/606257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号