链表的逆序遍历(带头节点)
一、不改变节点的位置
利用栈存储数据的特性——先进后出,将链表的节点压入栈中,再将节点出栈,实现链表的逆序遍历
// 逆序打印链表,不改变链表的数据位置(利用栈的特性)
public static void reversePrint(HeroNode head) {
if (head.next == null)
return;
HeroNode currentNode = head.next;
Stack<HeroNode> stack = new Stack<HeroNode>(); // 利用栈的特性,先进后出
while (currentNode != null) {
stack.push(currentNode); // 入栈
currentNode = currentNode.next;
}
while (stack.size() > 0) {
System.out.println(stack.pop()); // 出栈,实现逆序打印
}
}
二、反转链表,改变节点的位置
思路:
- 新建一个头节点;
- 将原来链表的节点依次加入到新头节点的最前端;
- 将原来头节点指向新的头节点。
public static void reverseLinkedList(HeroNode head) {
if (head.next == null || head.next.next == null)
return;
HeroNode temp = head.next;
HeroNode next = null; // 当前节点的下一个节点!!!
HeroNode newHead = new HeroNode(0, null, null); // 新的头节点
while (temp != null) {
next = temp.next; // 暂时保存当前节点的下一个节点
temp.next = newHead.next; // 将temp的下一个节点指向新链表的最前端!!!
newHead.next = temp; // 连接到新的链表
temp = next; // temp后移
}
head.next = newHead.next; // 实现链表反转
}