单链表面试题

1.求单链表中有效节点的个数
  • 从头结点从头到尾遍历计数即可
2.查找单链表的倒数第k个节点(新浪面试题)
  • 先从头遍历得到链表总的节点个数size
  • 从头节点开始遍历(size-k)次得到该节点
  • 如果没有返回null
3.单链表的反转(腾讯面试题)
  • 定义一个新的头结点newHead,从头节点head遍历链表,每遍历一个节点删除并保存这个节点,然后将此节点插入到newHead的后面。
 public void reverse() {
        // 如果链表没有节点或只有一个节点,不需要反转
        if (head.getNext() == null || head.getNext().getNext() == null) {
            return;
        }

        Node newHead = new Node();
        Node temp = head.getNext();
        // 遍历链表
        while (temp != null) {
            // 删除temp节点
            head.setNext(temp.getNext());
            // 将temp节点插入到newHead后面
            temp.setNext(newHead.getNext());
            newHead.setNext(temp);
            // 重置temp
            temp = head.getNext();
        }
        // 重置head节点
        head.setNext(newHead.getNext());
    }
4.从尾到头打印单链表
  • 方式一:先将单链表反转,再打印,打印结果就是一个逆序打印结果,但是不推荐使用,因为它会改变原链表的结构
  • 方式二:将链表的节点从头到尾放到栈中,使用栈先进后出的特点来打印链表
5.合并两个有序单链表A、B,合并之后链表依然有序(从小到大)

1.和反转链表差不多,先定义一个先的头结点newHead
2.分别从链表链表A和链表B找到他们最大的节点,将这两个节点删除并保存到maxA、maxB
3.比较maxA和maxB的大小,如果maxA>maxB,将maxA先插入newHead后面,在将maxB插入newHead后面
4.重复2、3步直到将所有节点合并

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值