链表 Linked List (单链表测试题)

在上一篇文章的基础上进行加入代码:链表 Linked List (单链表)

1 :求单链表当中有效节点的个数

在这里插入图片描述

public static int getLength(Node headnode) {
	if (headnode.next == null) {
		return 0;
	}
	int length = 0;
	Node temp = headnode.next;
	while (temp != null) {
		length++;
		temp = temp.next;
	}
	return length;
}

并且加上一个获取头节点的方法

public Node getHead() {
	return headnode;
}

测试效果图如下:
在这里插入图片描述
2.查询倒数第n个节点。

首先获取一个头节点,以及一个index。index表示倒数第几个节点
随后从头开始遍历,求得总长度length,使用length-index就可以得到是顺数第几个节点。
在这里插入图片描述

	public static Node findNode(Node head,int index) {
		//链表为空
		if (head==null) {
			System.out.println("链表为空");
			return null;
		}
		int length = getLength(head);
		//遍历到length-index 位置,即倒数第n个节点
		if (index<=0||index>length) {
			System.out.println("输入的index不合法");
			return null;
		} else {
			Node temp = head.next;
			//使用for循环进行定位
			for (int i = 0; i < length-index; i++) {
				temp =temp.next;
			}
			return temp;
		}	
	}
}

测试代码:求倒数第二个节点
在这里插入图片描述
3.单链表的反转

  1. 先定义-一个节点reversalHead =new Node();
  2. 从头到尾遍历原来的链表,每遍历-一个节点,就将其取出,并放在新的链表reversalHead的最前端.
  3. 原来的链表的head.next =reversalHead.next

在这里插入图片描述
代码如下:

public static void reversal(Node head) {
		// 链表为空或者只有一个节点的时候不需要反转
		if (head.next == null || head.next.next == null) {
			return;
		}
		// 辅助变量
		Node temp = head.next;
		Node next = null;
		Node reversalHead = new Node(0, "", "");
		// 遍历原来的链表
		while (temp != null) {
			next = temp.next;// 暂时保存当前节点的下一个节点
			temp.next = reversalHead.next;
			reversalHead.next = temp; //将反转后的头节点连接到现在遍历的这个节点
			temp = next;
		}
		// 将head.next指向reversalHead.next
		head.next = reversalHead.next;
	}

测试代码如下:
在这里插入图片描述
4:把单链表从尾到头打印

方式一:使用上述代码先将链表反转,遍历链表即可。但是会改变单链表的结构。
方式二:利用栈的先进后出的特点,将链表压到栈当中。
使用栈的方式:

	// 链表的反向打印
	public static void reversalnode(Node head) {
		if (head.next == null) {
			return;
		}
		Stack<Node> stack = new Stack<Node>();
		Node temp = head.next;
		//将链表节点压入栈中
		while(temp != null) {
			stack.add(temp);
			temp =temp.next;
		}
		//节点遍历打印
		while(stack.size()>0) {
			System.out.println(stack.pop());
		}
	}

测试代码:

System.out.println("逆序打印单链表:");
reversalnode(SingleLinkedList.getHead());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值