需求构想:比如一个单向链表中原来的顺序是1=>2=>3=>4=>5=>6=>7=>8=>9=>10,反转后变成10=>9=>8=>7=>6=>5=>4=>3=>2=>1。
代码实现:
package suanfa;
public class ReverseLink<T> {
private Node<T> head;
private Node<T> tail;
public Node<T> getHead() {
return head;
}
public void setHead(Node<T> head) {
this.head = head;
}
public Node<T> getTail() {
return tail;
}
public void setTail(Node<T> tail) {
this.tail = tail;
}
public void add(T t) {
Node<T> l = tail;
Node newNode = new Node(t,null);
tail = newNode;
if(l == null) {
head = newNode;
}else {
l.next = newNode;
}
}
private static class Node<T>{
private T value;
private Node<T> next;
public Node(){};
public Node(T value,Node<T> next){
this.value = value;
this.next = next;
};
public Node(T value){
this.value = value;
};
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
public void printValue() {
System.out.print(head.value);
Node<T> node = head.next;
while(node.next != null) {
System.out.print("=>"+node.value);
node = node.next;
}
System.out.println("=>"+tail.value);
}
public void reverse() {
Node<T> node = head.next;//记录下一个数
Node<T> pre = head;//记录前一个数
while(node.next != null) {
Node<T> next = node.next;
node.next = pre;
pre = node;
node = next;
}
node.next = pre;
head.next = null;
Node<T> newTail = head;
head = tail;
tail = newTail;
}
//利用递归来实现
public Node<T> reverseNode(Node<T> n){
reverseNode(n,n.next);
n.next = null;
head = tail;
tail = n;
return n;
}
public void reverseNode(Node<T> pre,Node<T> after){
if(after.next != null) {
reverseNode(after,after.next);
}
after.next = pre;
}
public static void main(String[] args) {
ReverseLink<Integer> list = new ReverseLink<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
list.add(10);
list.printValue();
list.reverse();
list.printValue();
list.reverseNode(list.head);
}
}
输出:
1=>2=>3=>4=>5=>6=>7=>8=>9=>10
10=>9=>8=>7=>6=>5=>4=>3=>2=>1
1=>2=>3=>4=>5=>6=>7=>8=>9=>10