剑指offer-从尾到头打印链表

2021年11月25日 阅读数:4
这篇文章主要向大家介绍剑指offer-从尾到头打印链表,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1.头插法,在原地遍历java

//先利用两个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;
         
    }
}