求链表的有效节点个数
/**
* @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());
}
}