链表打印延申知识—堆栈,递归,指针反转

一 **堆栈(Stack)(先进后出)(队列 先进先出)**
(java堆栈Stack和堆Heap的详解可参考链接:https://www.cnblogs.com/SunDexu/p/3140790.html)
栈是一种线形集合,其添加和删除元素的操作应在同一端尾部完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素。

Stack继承自Vector,底层是通过数组实现的。

Stack类有五个操作:
empty(),测试此堆栈是否为空。
peek(),查看此堆栈顶部的对象,而不从堆栈中删除它。
pop(),删除此堆栈顶部的对象,并将该对象作为此函数的值返回。
push(E item),将项目推送到此堆栈的顶部。
search(object o),返回一个对象在此堆栈上的基于1的位置。
存取数据的push()方法就像将子弹装入弹夹的的过程,先装的子弹在最底下,后装入的子弹总是在顶上,而pop()方法就是开枪子弹发射,最后存入的子弹,最先射出来。

实列:从尾到头打印链表(利用堆栈)
ListNode类代码见上一篇文章

package cn.itcast.test3;
/*
方法一:使用ArrayList实现 从尾到头输出一个链表
 */

import java.util.ArrayList;
import java.util.Stack;

public class StackTest {

    public static void main(String[] args){

        ListNode head=new ListNode(1);
        ListNode n1=new ListNode(2);
        ListNode n2=new ListNode(3);

        head.setNext(n1);
        n1.setNext(n2);

        Solution1 solution1=new Solution1();
        solution1.printListFromTailToHead(head);
        
    }
}

class Solution1 {
    public  void printListFromTailToHead(ListNode listNode) {
        Stack st=new Stack();
        while(listNode!=null){
            st.push(listNode.val);
            listNode=listNode.next;
        }

        while(!st.isEmpty()){
            System.out.println(st.pop());
        }

    }

}

二 递归
栈的本质也是递归,所以也可以利用递归来从尾到头打印链表。
代码如下:

public class RecursionTest {

    public static void main(String[] args){
        ListNode head=new ListNode(1);
        ListNode n1=new ListNode(2);
        ListNode n2=new ListNode(3);

        head.setNext(n1);
        n1.setNext(n2);

        Solution3 solution3=new Solution3();
        solution3.printListFromTailToHead(head);
    }
}


class Solution3{
    public void printListFromTailToHead(ListNode listNode){
            if(listNode!=null){
                if(listNode.next!=null){
                    printListFromTailToHead(listNode.next);
                }
            }
            System.out.println(listNode.val);
    }
}

三 指针反转
使从左往右指向的链表变成从右往左指向

package cn.itcast.test3;
/*
   方法一:使用ArrayList实现 从尾到头输出一个链表
 */
import java.util.ArrayList;
class practice {
    public static void main(String[] args){

        ListNode head=new ListNode(1);
        ListNode n1=new ListNode(2);
        ListNode n2=new ListNode(3);
        ListNode n3=new ListNode(4);

        head.setNext(n1);
        n1.setNext(n2);
        n2.setNext(n3);

        Solution solution=new Solution();
        solution.printListFromTailToHead(head);
    }
}

 class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList al=new ArrayList();
        ListNode next=null;
        ListNode pre=null;

        while(listNode!=null){
           next=listNode.next;
           listNode.next=pre;
           pre=listNode;
           listNode=next;
        }
        while(pre!=null){
            al.add(pre.val);
            System.out.println(pre.val);
            pre=pre.next;
        }
      return al;
    }
}

参考文章:https://blog.csdn.net/weixin_39795049/article/details/85832150

发布了10 篇原创文章 · 获赞 0 · 访问量 73

猜你喜欢

转载自blog.csdn.net/weixin_42146993/article/details/104664437