求单链表中有效节点的个数
public static int getLength(HeroNode head) {
if (head.getNext() == null) {
// 空链表
return 0;
}
int length = 0;
// 定义一个辅助变量,没有统计头结点
HeroNode cur = head.getNext();
while (cur != null) {
length++;
cur = cur.getNext();
}
return length;
}
查找单链表中倒数第k个节点
public static int getLength(HeroNode head) {
if (head.getNext() == null) {
// 空链表
return 0;
}
int length = 0;
// 定义一个辅助变量,没有统计头结点
HeroNode cur = head.getNext();
while (cur != null) {
length++;
cur = cur.getNext();
}
return length;
}
public static HeroNode findLastIndexNode(HeroNode head, int index) {
// 判断如果链表为空,返回null
if (head.getNext() == null) {
return null;
}
int size = getLength(head);
// 对index做个校验
if (index <=0 || index > size) {
return null;
}
HeroNode cur = head.getNext();
for (int i = 0; i < size - index; i++) {
cur = cur.getNext();
}
return cur;
}
单链表的反转
public static void reverseList(HeroNode head) {
// 如果链表为空或者只有一个节点就无需反转
if (head.getNext() == null || head.getNext().getNext() == null) {
return;
}
// 定义一个辅助指针
HeroNode cur = head.getNext();
HeroNode next = null; // 指向当前节点cur的下一个节点
HeroNode reverseHead = new HeroNode(0, "", "");
while (cur != null) {
next = cur.getNext();
cur.setNext(reverseHead.getNext());
reverseHead.setNext(cur);
cur = next;
}
// 将head.next指向reverseHead.next,实现单链表的反转
head.setNext(reverseHead.getNext());
}
从尾到头打印单链表
方式一:反向遍历
可以将单链表进行反转,然后再进行打印。这样做的坏处是会破坏原有的链表结构。
方式二:使用栈
public static void reversePrint(HeroNode head) {
if (head.getNext() == null) {
return;// 空链表,不能打印
}
Stack<HeroNode> stack = new Stack<>();
HeroNode cur = head.getNext();
while (cur != null) {
stack.push(cur); // 压入栈
cur = cur.getNext();
}
while (stack.size() > 0) {
// 将栈中的节点进行弹出并打印
System.out.println(stack.pop()); // 栈的特点是先进后出
}
}