java单链表节点翻转_Java实现单链表翻转

单链表翻转比如有如下链表:

需要按照C B A 输出,我们可以有好几种方法:

package org.andy.test;

import java.util.ArrayList;

import java.util.List;

/**

* @author andy

* @version:2015-2-4 上午9:41:12

*

*

*/

public class LinkedReverse {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

N n = new N();

n.name = "A";

N n1 = new N();

n1.name = "B";

N n2 = new N();

n2.name = "C";

N n3 = new N();

n3.name = "D";

n1.nextN = n2;

n.nextN = n1;

n2.nextN = n3;

N old = n;

while (old != null) {

System.out.println(old.name);

old = old.nextN;

}

System.out.println("链表翻转1");

N new1 = reverseOne(n);

while (new1 != null) {

System.out.println(new1.name);

new1 = new1.nextN;

}

/*

System.out.println("链表翻转2");

N new2 = reverseTwo(n, null);

while (new2 != null) {

System.out.println(new2.name);

new2 = new2.nextN;

}

System.out.println("链表翻转3");

N new3 = reverseThree(n);

while (new3 != null) {

System.out.println(new3.name);

new3 = new3.nextN;

}

*/

}

//采用交换前后值

public static N reverseOne(N n) {

if (n != null) {

N preN = n; //前一个节点

N curN = n.nextN; //当前节点

N nextN ; //后一个节点

while (null != curN) {

nextN = curN.nextN;

curN.nextN = preN;

preN = curN;

curN = nextN;

}

n.nextN = null;

n = preN;

return n;

}

return null;

}

//采用递归实现

public static N reverseTwo(N n, N newN) {

// 采用递归 返回 返回条件是最后一个几点nextN为空

if (n == null) {

return newN;

}

N nextN = n.nextN;

n.nextN = newN;

return reverseTwo(nextN, n);

}

//最烂的实现方式

public static N reverseThree(N n) {

if (n == null) {

return null;

}

// 定义一个集合 ,放在集合里面在单个反向指回

List nList = new ArrayList();

N p = n;

while (p != null) {

N node = new N();// 当前节点

node.name = p.name;

nList.add(node);

p = p.nextN;

}

// 在返现输出节点

n = null;

for (N rn : nList) {

if (n != null) {

// 如果n不为空时

rn.nextN = n;

}

n = rn;

}

return n;

}

}

// 定义一个节点

class N {

public String name;

public N nextN;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值