数据结构与算法(java)第三章 单链表的面试题

数据结构与算法(java)第三章 单链表的面试题

1)求单链表的节点数
2)查找单链表中的倒数第k个节点【新浪面试题】
3)单链表的反转(腾讯面试题)
4)从尾到头打印单链表(百度,要求方式1:反向遍历。方式2:stack栈)
5)合并两个有序的单链表,合并后的单链表仍然有序

1)求单链表的节点数
代码实现:

public static int getLength(HeroNode head){
        if (head.next == null){
            return  0;
        }
        int length = 0;
        HeroNode cur = head.next;
        while (cur !=null){
            length++;
            cur = cur.next;
        }
        return length;
    }

2)查找单链表中的倒数第K个节点
思路:

  1. 编写一个方法,接收head节点,同时接收一个index(表示倒数第index个节点)
  2. 先将链表从头到尾遍历得到链表的总长度getLength
  3. 得到size后,我们从链表的第一个开始遍历(size-index)个,就可以得到
  4. 如果找到了,返回该节点,否则返回空。
    代码实现:
//查找倒数第k个节点
    public static HeroNode findLastIndexNode(HeroNode head , int index){
        if (head.next == null){
            return null;
        }
        int size = getLength(head);
        if (index <=0 || index >size){
            return null;
        }
        HeroNode cur = head.next;
        for (int i = 0; i < size-index; i++) {
            cur = cur.next;
        }
        return  cur;
    }

链表反转的思路
1)定义一个节点reverseHead = new HeroNode();
2)从头到尾遍历原来的链表,每遍历一个节点,将其取出,并放在心得链表reversHead的最前端
3)原来的链表head.next = reverseHead.next

代码实现:

 //单链表的反转
    public static void reverseList(HeroNode heroNode){
        //如果当前链表为空,或者只有一个节点,无需反转,直接返回
        if (heroNode.next == null || heroNode.next.next == null){
            return;
        }
        //定义一个辅助变量
        HeroNode cur = heroNode.next;
        HeroNode next = null;//指向当前节点的下一个节点
        HeroNode reverseHead = new HeroNode(0,"","");
        //遍历原来的链表
        while (cur !=null){
            next = cur.next;//暂时保存当前节点的下一个节点
            cur.next = reverseHead.next;
            reverseHead.next = cur;
            cur = next;
        }
        //将head.next指向reverseHead
        heroNode.next =  reverseHead.next;
    }

从尾到头打印单链表
思路分析:
1)先将单链表反转,然后再遍历(会破坏原来的链表结构,不建议)
2)利用栈,将各个节点压入到栈中,利用先进后出的特点
代码实现:

 public static void reversePrint(HeroNode head){
        if (head.next == null){
            return;//链表为空不需要打印
        }
        //创建一个栈,将各个节点压入到栈中
        Stack<HeroNode> stack = new Stack<HeroNode>();
        HeroNode cur = head.next;
        while (cur !=null){
            stack.push(cur);
            cur = cur.next;
        }
        //将栈中的节点遍历
        while (stack.size() > 0){
            System.out.println(stack.pop());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值