链表反转 递归实现Java

啊 就因为我实现单链表时多一个头结点 差点…平安夜快乐 虽然是明天晚上 不过是我梦开始的时间。

package com.zhang;

public class Solution {

    //先构造一个简单的单链表
    private class LinkNode{
        int val;//值域
        LinkNode next;//下一个节点引用

        public LinkNode() {
            this.next = null;//初始化
        }

        public LinkNode(int val) {
            this.val=val;
            this.next=null;
        }
    }

    //创造一个链表头结点并返回
    public LinkNode create(){

        LinkNode head = new LinkNode();//初始化的事情可以放在它的无惨构造
        return head;
    }

    //往链表中添加元素  尾插
    public boolean add(int val,LinkNode ph){

        //找到链表结尾
        while (ph.next!=null){
            ph=ph.next;
        }

        //创造新节点  初始化事情可以放在LinkNode的有参构造里
        LinkNode pNew = new LinkNode(val);
        ph.next = pNew;
        return true;

    }

    private int i=0; //记录方法的调用次数
    private LinkNode ph; //记录头结点  因为互换从首结点开始
    //链表反转  递归实现
    public LinkNode reverseLink(LinkNode pf) {

        /*
        *f(0)->f(1)->f(2)...f(n)
        *求  f(n)->f(n-1)...f(0)
        */
        //记录头结点  因为我的链表头结点和首结点不是一个结点
        if(this.i==0){this.ph=pf; pf=this.ph.next;}
        this.i=2;

        //递归实现
        if (pf == null || pf.next == null) {//找到最后一个节点
            //最后一个节点存入head节点的 next域中返转
            ph.next = pf;
            return  ph;
        } ;

        //ph 往后移动一位 用pt记录一下
        LinkNode pt = pf.next;
        LinkNode ret = reverseLink(pt);
        //先给自己后面的节点地址域赋值
        pf.next.next= pf;
        pf.next = null;
        return ret;
    }

    //打印链表
    public  void showall(LinkNode ph){
        while (ph.next!=null){
            System.out.print(ph.next.val+",");
            ph=ph.next;
        }

    }

    public static void main(String[] args) {
        Solution s= new Solution();
        LinkNode l = s.create();
        s.add(1,l);
        s.add(2,l);
        s.add(3,l);
        s.add(6,l);
        s.add(5,l);
        s.add(7,l);
        s.showall(l);
        System.out.println();
        System.out.println("---------");
        s.showall(s.reverseLink(l));
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值