单链表常见面试题

求链表的有效节点个数


	/**
	 * @Description:  
	 * @param: @param head 链表头节点
	 * @param: @return      
	 * @return: int  返回有效节点个数    
	 * @throws
	 */
	public static int getLength(HereNode head) {
		if (head.next == null) {  // 空链表
			return 0;
		}
		int length = 0;
		// 定义以个辅助变量
		HereNode cur = head;
		while(true) {
			if(cur.next == null) { //说明cur已在最后 
				break;
			}
			length ++;
			cur = cur.next;
			
		}
		return length;
	} 

测试结果:

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

    // 查找单链表中的倒数第K个节点
	// 思路:1先得到链表的总长度Size,2 从链表的第一个开始遍历(Size - index)个就可以得到
	public static HereNode findLastIndexNode(HereNode head,int index) {

		if (head.next == null) {  // 空链表
			return null;   
		}
		// 得到链表的Size
		int size = getLength(head);
		
		if (index <= 0 || index > size) {  // 先校验
			return null;
		}
		
		// 辅助变量
		HereNode cur = head.next; // 假设 Size为3 要查倒数第二个 那么需要遍历3-2=1 次
		// 开始遍历 Size - index
		for (int i = 0; i < size - index; i++) {
			cur = cur.next;
		}
		return cur;
		
	}

测试结果:


  

反转链表

public static void reverse(HereNode head) {
		if (head.next == null || head.next.next == null) { // 空链表和只有一个节点的链表直接返回
			return;
		}
		//定义一个当前的辅助变量
		HereNode cur = head.next;
		//定义一个当前节点的后一个节点变量
		HereNode next = null;
		// 定义一个新链表
		HereNode reverseHead = new HereNode(0, "", "");
		// 遍历原来的链表,每遍历一个,将其取出指向reverseHead的最前端
        // 下面4步好好思考
		while(cur != null) {
			// 保留当前节点的后一个节点
			next = cur.next;
			// 将当前节点的后一个节点指向reverseHead的最前端
			cur.next = reverseHead.next;
			// 将reverseHead 指向
			reverseHead.next = cur;
			// 让cur后移
			cur = next;
		}
		head.next = reverseHead.next;
		
	}

 测试结果

从尾到头打印单链表(利用栈的先入后出特性)

 

public static void reversePrint(HereNode head) {
		if (head.next == null ) {  //空链表 
			return;
		}
		// 创建个栈
		Stack<HereNode> stack = new Stack<>();
		// 定义个当前的辅助变量
		HereNode cur = head.next;
		// 遍历链表,依次放入栈中
		while(cur != null) {
			stack.add(cur);
			// 下移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、付费专栏及课程。

余额充值