剑指offer-从尾到头打印链表
1.头插法,在原地遍历
//先利用两个pre和next两个指针将头节点为cur的链表反转, //在依次遍历链表存储到一个ArrayList并返回 import java.util.ArrayList; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode cur) { ArrayList<Integer> list=new ArrayList<Integer>(); ListNode pre=null; ListNode next=null; while(cur!=null){ next=cur.next; cur.next=pre; pre=cur; cur=next; } while(pre!=null){ list.add(pre.val); pre=pre.next; } return list; } }
反转单向链表 public ListNode reverse(ListNode head){ ListNode pre=null; while(head!=null){ ListNode next=head.next;//记录保留当前结点的下一个结点的地址 head.next=pre;//当前结点指针域(原为下一个结点的地址)改为上一个节点的地址 pre=head;//上一个结点变为当前结点,为之后的循环做准备 head=next;//当前结点变为下一个结点,为之后的循环做准备 } return pre; } 作者:淡茶菌 链接:https://www.zhihu.com/question/27090581/answer/223772820 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035 来源:牛客网 public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList list=new ArrayList(); if(listNode==null) return list; ListNode dummy=new ListNode(0); dummy.next=listNode; ListNode cur=listNode; // 链表就地反转 while(cur.next!=null) { ListNode temp=cur.next; cur.next=temp.next; temp.next=dummy.next; dummy.next=temp; } ListNode head=dummy.next; while(head!=null) { list.add(head.val); head=head.next; } return list; } }