java数据结构与算法之单链表常见面试题(含完整 Demo)

359 阅读2分钟

目录:

  • 单链表中有效数据
  • 单链表数据反转
  • 不改变原数据反转数据

上一篇给大家介绍了单链表的使用,本篇给大家分析一下单链表常见的面试题(全是干货)

单链表中有效数据

效果图:

image.png

最终有效数据结果为: 5

代码实现:

//单链表有效个数
    public int linkedLength(HeroNode head) {

        int length = 0;

        while (head.next != null) {
            length++;
            head = head.next;
        }
        return length;
    }

总结:

  • 传入头结点,循环头节点中所有数据,通过 length 标识记录下来即可

单链表数据反转

效果图:

image.png

第一次分析:

  • 1.遍历头节点所有数据
  • 2.通过一个辅助reverseHead头节点,将节点数据依次添加到辅助节点reverseHead上

我这么说可能优点生硬.看图说话!

辅助图:

image.png

第二次分析:

  • 1.要想完成单链表反转,那么单链表中的有效元素就必须 >= 2,否则只有一个元素也不需要反转
  • 2.最后将原来头结点指向reverseHead的下一个位置完成单链表的反转

具体实现:

    //单链表反转
    public void reversal(HeroNode head) {
        //链表个数<=0 不能反转
        if (head.next == null || head.next.next == null) {
            return;
        }

        //定义辅助遍历.帮我遍历原来链表
        HeroNode temp = head.next;

        //指向当前节点的下一个节点
//        HeroNode next = null;

        //反转的节点
        HeroNode reverseHead = new HeroNode(0, "", "");

        //遍历原来链表,每遍历一次,放入到reverseHead中
        while (temp != null) {
            //保存当前节点的下一个节点(next为辅助节点)
            HeroNode next = temp.next;

            //将 cur 的下一个节点指向新的链表的头结点
            temp.next = reverseHead.next;

            //将 cur 连接到新的链表上
            reverseHead.next = temp;

            //让 cur 指向下一个节点
            temp = next;
        }

        //将 head.next 指向 reverseHead.next
        head.next = reverseHead.next;
    }

使用:

        linkedList.add(new HeroNode(1, "宋江", "及时雨"));
        linkedList.add(new HeroNode(5, "秦明", "霹雳火"));
        linkedList.add(new HeroNode(6, "柴进", "小旋风"));
        linkedList.add(new HeroNode(3, "吴用", "智多星"));
        linkedList.add(new HeroNode(2, "李逵", "黑旋风"));
        
         linkedList.show();

        linkedList.reversal(linkedList.head);

        System.out.println("反转后的结果为:");
        linkedList.show();  

运行结果为:

HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=5, name='秦明', nickName='霹雳火'}
HeroNode{no=6, name='柴进', nickName='小旋风'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=2, name='李逵', nickName='黑旋风'}
反转后的结果为:
HeroNode{no=2, name='李逵', nickName='黑旋风'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=6, name='柴进', nickName='小旋风'}
HeroNode{no=5, name='秦明', nickName='霹雳火'}
HeroNode{no=1, name='宋江', nickName='及时雨'}

图解理解:

image.png

不改变原数据反转数据

最终完成效果图:

图片.png

分析:

  • 不改变原数据反转数据,使用上边的方法也可以直接做到,知识最后不拿原数据头结点指向改变后的节点即可,不过这种方法不好用,接下来给大家介绍Stack(栈)的使用

java Stack()栈的使用

图解:

图片.png

Stack()方法介绍返回类型说明
push(Object obj)T添加一个元素
peek()T返回最后一个元素
stack.search(Object)T元素下标
pop()T取出数组末尾的元素,然后将该元素从数组中删除。
empty()booleanStack()是否为null

java Stack()栈的使用

完整代码:

//不改变原来数据,倒叙打印数据
    public void reversal2(HeroNode head) {

        HeroNode temp = head;

        Stack<HeroNode> heroNodeStack = new Stack<>();


        while (temp.next != null) {
            heroNodeStack.add(temp.next);
            temp = temp.next;
        }

        while (heroNodeStack.size() > 0) {
            System.out.println("反转数据为:"+heroNodeStack.pop());
        }
    }

使用:

        System.out.println("原数据为:");

        initData(linkedList);
        linkedList.show();

        System.out.println("不改变原数据,倒叙打印数据:");
        linkedList.reversal2(linkedList.head);

        System.out.println("原数据为:");
        linkedList.show();

运行结果为:

原数据为:
HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=5, name='秦明', nickName='霹雳火'}
HeroNode{no=6, name='柴进', nickName='小旋风'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=2, name='李逵', nickName='黑旋风'}
不改变原数据,倒叙打印数据:
反转数据为:HeroNode{no=2, name='李逵', nickName='黑旋风'}
反转数据为:HeroNode{no=3, name='吴用', nickName='智多星'}
反转数据为:HeroNode{no=6, name='柴进', nickName='小旋风'}
反转数据为:HeroNode{no=5, name='秦明', nickName='霹雳火'}
反转数据为:HeroNode{no=1, name='宋江', nickName='及时雨'}
原数据为:
HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=5, name='秦明', nickName='霹雳火'}
HeroNode{no=6, name='柴进', nickName='小旋风'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=2, name='李逵', nickName='黑旋风'}

完整代码

猜你喜欢:

数据结构与算法目录

原创不易,您的点赞就是对我最大的支持~