单链表翻转比如有如下链表:
需要按照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;
} 转自:http://blog.csdn.net/fengshizty/article/details/44460243