一、单链表的反转
思路:
- 先定义一个节点reverseHead = new HeroNode();
- 从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端
- 原来的链表的head.next = reverseHead.next
public void reverseList(HeroNode head){
//如果当前链表为空,或者只有一个节点,无需反转,直接返回
if(head.next == null || head.next.next == null){
return;
}
//定义一个辅助的指针,帮我们遍历原来的链表
HeroNode cur = head.next;
HeroNode Listnext = null;
HeroNode reverseHead = new HeroNode(0,"","");
//遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表revserseHead的最前端
while (cur!= null){
Listnext = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
reverseHead.next = cur;//将cur连接到新链表上
cur = Listnext;//让cur后移
}
head.next = reverseHead.next;
}
二、单链表的逆序打印
思路:
- 上面的题的要求就是逆序打印单链表
- 方式1:先将单链表进行翻转操作,然后再遍历即可,这样做的问题就是会破坏原来的单链表的结构,不建议
- 方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果
public void reverprint(HeroNode head){
if(head == null){
return;
}
//创建一个栈,将各个节点压入栈
Stack<HeroNode> stack = new Stack<HeroNode>();
HeroNode cur = head.next;
//将链表所有节点压入栈
while (cur !=null){
stack.push(cur);
cur = cur.next;//cur后移,这样可以压入下一个节点
}
//将栈中的节点进行打印,pop出栈
while (stack.size() >0){
System.out.println(stack.pop());
}
}