链表-从尾部到头打印单链表-4
1、单链表逆转,然后遍历输出
https://blog.csdn.net/qq_43209742/article/details/117489111
1 //将单链表反转 这里的head含虚拟的头结点 2 public static void reversetList(HeroNode head) { 3 //如果当前链表为空,或者只有一个节点,无需反转,直接返回 4 if(head.next == null || head.next.next == null) { 5 return ; 6 } 7 8 //定义一个辅助的指针(变量),帮助我们遍历原来的链表 9 HeroNode cur = head.next; 10 HeroNode next = null;// 指向当前节点[cur]的下一个节点 11 HeroNode reverseHead = new HeroNode(0, "", ""); 12 //遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead 的最前端 13 //动脑筋 14 while(cur != null) { //如果cur=null,说明已经遍历结束 15 next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用 16 cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端 17 reverseHead.next = cur; //将cur 连接到新的链表上 18 cur = next;//让cur后移 19 } 20 //将head.next 指向 reverseHead.next , 实现单链表的反转 21 head.next = reverseHead.next;//注意head才是真正的头,reverseHead只是用来临时当一下头节点 22 } 23 24 /** 25 * 打印链表的值 这个head没有虚拟头结点 26 * @param head 27 */ 28 public static void printList(ListNode head){ 29 //定义临时节点 30 ListNode temp=head; 31 while(temp!=null){ 32 System.out.println(temp.value); 33 temp=temp.next; 34 } 35 }
2、使用栈,不破坏原来链表的结构 ,利用栈的先进后出的特性。
参靠:https://blog.csdn.net/chengqiuming/article/details/114270842
/** * 功能描述:从尾到头打印单链表 * * @param head 头节点 * @author cakin * @date 2021/3/1 * @description: 可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果 */ public static void reversePrint(HeroNode head) { if (head.next == 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()); // stack的特点是先进后出 } } }