java 反转单链表_单链表的反转(java实现)

递归法

总体来说,递归法是从最后一个Node开始,在弹栈的过程中将指针顺序置换的。递归法实现图

e8e22398bf7215f12971e1da6ddd3a6f.png

为了方便理解,我们以 1->2->3->4这个链表来做演示。输出的效果是4->3->2->1

首先定义Node:packagecn.liuhaihua;

publicclassNode{

Nodenext;

Tobject;

/**

* 构造函数

* @param next

* @param object

*/

publicNode(Nodenext,Tobject){

this.next=next;

this.object=object;

}

}

反转方法如下:/**     *  递归反转     * @param node     * @return     */    public static Node reverse(Node node){        Node newnode =null;        if(null==node||null==node.next)        {            return node;        }else{            Node temp =  node.next;            newnode = reverse(node.next);            temp.next = node;            node.next=null;        }        print(newnode);        return newnode;    }

递归实质上就是系统帮你压栈的过程,系统在压栈的时候会保留现场。

我们来看是怎样的一个递归过程:1->2->3->4

程序到达Node newnode = reverse(node.next);时进入递归 我们假设此时递归到了3结点,此时node=3结点,temp=3结点.next(实际上是4结点) 执行Node newnode = reverse(node.next);传入的node.next是4结点,返回的newnode是4结点。接下来就是弹栈过程了 程序继续执行 temp.next = node就相当于4->3 node.next = null 即把3结点指向4结点的指针断掉。返回新链表的头结点newnode注意:当return后,系统会恢复2结点压栈时的现场,此时的node=2结点;temp=2结点.next(3结点),再进行上述的操作。最后完成整个链表的翻转。

遍历法

遍历法就是在链表遍历的过程中将指针顺序置换

先上代码:public static Node reverseList(Node node) {  Node pre = null;  Node next = null;  while (node != null) {      next = node.next;      node.next = pre;      pre = node;      node = next;  }  return pre;}

依旧是1->2->3->4 准备两个空结点 pre用来保存先前结点、next用来做临时变量 在头结点node遍历的时候此时为1结点 next = 1结点.next(2结点) 1结点.next=pre(null) pre = 1结点 node = 2结点 进行下一次循环node=2结点 next = 2结点.next(3结点) 2结点.next=pre(1结点)=>即完成2->1 pre = 2结点 node = 3结点 进行循环...

最后附上完整的示例代码packagecn.liuhaihua;

/**

*单链表反序

*/

publicclassNodeReverse{

publicstaticvoidmain(Stringargs[]){

Nodenode_d=newNode(null,"D");

Nodenode_c=newNode(node_d,"C");

Nodenode_b=newNode(node_c,"B");

Nodenode_a=newNode(node_b,"A");

System.out.println("反转前:");

print(node_a);

System.out.println("反转ing:");

//Node reversenode =reverse(node_a);

Nodereversenode=reverseList(node_a);

System.out.println("反转后:");

print(reversenode);

}

/**

*  递归反转

* @param node

* @return

*/

publicstaticNodereverse(Nodenode){

Nodenewnode=null;

if(null==node||null==node.next)

{

returnnode;

}else{

Nodetemp=node.next;

newnode=reverse(node.next);

temp.next=node;

node.next=null;

}

print(newnode);

returnnewnode;

}

/**

* 遍历反转

* @param node

* @return

*/

publicstaticNodereverseList(Nodenode){

Nodepre=null;

Nodenext=null;

while(node!=null){

next=node.next;

node.next=pre;

pre=node;

node=next;

print(pre);

}

returnpre;

}

/**

* 遍历节点数据

* @param node

*/

publicstaticvoidprint(Nodenode){

System.out.print("node遍历:"+node.object.toString());

while(node.next!=null){

node=node.next;

System.out.print("-->"+node.object.toString());

}

System.out.println("\n");

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值