链表的面试题

1、求链表中有效节点个数

(不算头结点)

//方法:获取单链表节点的有效个数
		/**
		 * 
		 * @param Head 链表头节点
		 * @return 返回有效个数
		 */
		public static int getLength(ExerciseNode Head) {
			if(Head.next==null) {
				return 0;
			}
			int length = 0;
			ExerciseNode newNode = Head.next;
			while (newNode != null) {
				length++;
				newNode = newNode.next;
			}
			return length;
		}

2、新浪面试题

查找单链表倒数第K个节点

  1. 编写一个方法,接收head节点,同时接收一个index
  2. index 表示倒数第index个节点
  3. 先把链表从头到尾遍历,得到总长度 get length
  4. 得到size后 从链表第一个开始遍历(size -index)个可以得到
//寻找倒数第K个节点
	public static HeroNode findLastIndexNode(HeroNode head,int index) {
		//判断链表是否为空
		if(head.next == null) {
			return null;//没有找到
		}
		//第一次遍历链表长度
		int size = getLength(head);
		//第二次遍历 size - index位置,
		//先做一个index校验
		if(index <0 || index>size) {
			return null;//没有找到
		}
		//定义一个辅助变量
		HeroNode curr = head.next;
		for(int i=0;i<size-index;i++) {
			curr = curr.next ;
		}
		return curr;
	}
3、腾讯面试题

实现链表反转

  1. 先定义一个节点 reverseHead = new HeroNode();
  2. 从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新链表最前端
  3. 原来的链表的head.next =reverseHead.next
	//将单链表进行反转
	public static void reverseList(HeroNode head) {
	//当前链表为空或者只有一个节点
	if(head.next == null || head.next.next ==null ) {
		return ;
	}
	//定义一个辅助指针,帮助遍历原来的链表
	HeroNode cur = head.next;
	HeroNode next = null;//指向cur的下一个节点
	HeroNode reverseHead = new HeroNode(0,"","");
	//遍历原来的链表 每遍历一个节点,就将其取出,放在新链表reverseHead的最前端
	while(cur !=null) {
		next = cur.next;//先暂时保存当前节点(cur)的下一个节点,后面需要使用
		cur.next = reverseHead.next;//将cur的下一个节点指向新链表的最前端
        reverseHead.next = cur;//将cur连接到新的链表上!!!!!!!!!!
		cur = next;//让cur后移
	}
	//将head.next 指向reverseHead.next;
	head.next = reverseHead.next;
	      }
4、百度面试题

逆序打印单链表

  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;//cur后移,就可以压入下一个节点
    		}
    		//将栈中节点打印, pop 出栈
    		while (stack.size()>0 ) {
    			System.out.println(stack.pop());//stack 先进后出
    		}
    	}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值