反转链表:
将链式存储的链表反转,如原始链表为:head->node1->node2->node3...->tail,
反转后为taill->...node3->node2->node1->head.
我分别用了非递归和递归的方法实现,java代码如下:
Node.javapublic class Node {
public char data;
public Node next;
public Node(char data, Node next)
{
this.data = data;
this.next = next;
}
public Node(char data)
{
this.data = data;
this.next = null;
}
}
ReverseLinkedList.javaimport java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReverseLinkedList {
private Node head;
private Node tail;
public ReverseLinkedList() {
this.head = null;
this.tail = null;
}
public boolean isEmpty() {
return (this.head == null);
}
public void CreateLinkedList() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
Node node = null;
char data;
try {
str = br.readLine();
}catch (IOException e) {
e.printStackTrace();
}
for(int i=0; i
data = str.charAt(i);
if(data != ' ') {
node = new Node(data);
if(i==0) {
head = node;
tail = node;
}
else {
tail.next = node;
tail = node;
}
}
}
}
public void PrintLinkedList() {
System.out.print("Head");
Node node = this.head;
while(node!=null) {
System.out.print("->" + node.data);
node = node.next;
}
System.out.println("->Tail");
}
//反转链表,非递归方法
public void ReverseIt() {
if(isEmpty()) return ;
Node previous=null;
Node current = this.head;
Node next = this.head.next;
while(true) {
current.next = previous;
previous = current;
if(previous == this.tail) break;
current = next;
next = next.next;
}
tail = head;
head = previous;
}
//反转链表,递归方法实现
public Node ReverseIt(Node node) {
if(node==null || node==tail) return node;
Node next = ReverseIt(node.next);
next.next = node;
return node;
}
public void Reverse() {
Node tempt = ReverseIt(this.head);
head = tail;
tail = tempt;
if(tail!=null) tail.next = null;
}
}
TestDriver.javapublic class TestDriver {
public static void main(String arg[]) {
ReverseLinkedList forTest = new ReverseLinkedList();
forTest.CreateLinkedList();
forTest.PrintLinkedList();
forTest.ReverseIt();
forTest.PrintLinkedList();
forTest.Reverse();
forTest.PrintLinkedList();
}
}
控制台下的运行如例子: