用两种方法实现。
public class ReverseLinkTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Link link = new Link();
Node head = link.createLink();
link.print(head);
link.print(link.reverseLink(head));
}
}
class Node{
private int data;
private Node next;
public Node(){}
public Node(int data, Node next){
this.data = data;
this.next = next;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
class Link{
private final static int length = 5;
Node linkHead = new Node(0 , null);
public Node createLink(){
for(int i = length ; i > 0 ; i--){
Node n = new Node(i , null);
n.setNext(linkHead.getNext());
linkHead.setNext(n);
}
return linkHead;
}
public void print(Node linkHead){
while(linkHead != null){
System.out.print(linkHead.getData() + " ");
linkHead = linkHead.getNext();
}
System.out.println();
}
public Node reverseLink(Node linkHead){
if(linkHead == null || linkHead.getNext() == null){
return linkHead;
}
Node reverseLink = null, p = null;
reverseLink = linkHead;
linkHead = linkHead.getNext();
reverseLink.setNext(null);
p = linkHead.getNext();
while(linkHead != null){
linkHead.setNext(reverseLink);
reverseLink = linkHead;
linkHead = p;
if(p != null){
p = p.getNext();
}
}
return reverseLink;
}
public Node reverseLink2(Node linkHead){
if(linkHead == null || linkHead.getNext() == null){
return linkHead;
}
Node reverseLink = null, p = null;
reverseLink = linkHead.getNext();
while(reverseLink.getNext() != null){
p = reverseLink.getNext();
reverseLink.setNext(p.getNext());
p.setNext(linkHead.getNext());
linkHead.setNext(p);
}
reverseLink.setNext(linkHead);
reverseLink = linkHead.getNext();
linkHead.setNext(null);
return reverseLink;
}
}
Go语言
package main
import (
"fmt"
)
type node struct {
data int
next *node
}
func main() {
length := 5
head := &node{0,nil}
head = createLink(head, length)
printLink(head)
reversedHead := reverseLink(head)
printLink(reversedHead)
}
func createLink(head *node, length int) *node {
if length <= 0 {
return head
}
for i := length - 1; i > 0; i-- {
p := &node{i, nil}
p.next = head.next
head.next = p
}
return head
}
func printLink(head *node) {
for p := head; p != nil; p = p.next {
fmt.Print(p.data)
fmt.Print(" ")
}
fmt.Println()
}
func reverseLink(head *node) *node {
if head == nil || head.next == nil {
return head
}
var reversedHead *node
var p *node
reversedHead = head
head = head.next
reversedHead.next = nil
p = head.next
for head != nil {
head.next = reversedHead
reversedHead = head
head = p
if p != nil {
p = p.next
}
}
return reversedHead
}