我理解的链表倒置的意思应该是比如 a->b 变成 b->a ,
核心算法不难,
a->b->c->d->f
a->null
b->c->d->f
b->a->null c->d->f
如同上述,先把当前结点指向null,再取出它原本的下一个结点指向它
核心算法不难,
a->b->c->d->f
a->null
b->c->d->f
b->a->null c->d->f
如同上述,先把当前结点指向null,再取出它原本的下一个结点指向它
通过while循环,执行到最后,f->d
package edu.fjnu.service;
import edu.fjnu.domain.LinkNode;
public class Init {
public LinkNode InitNode(){
//初始化,a->b->c->d->e->f->null
LinkNode head = new LinkNode("a");
LinkNode nodeb = new LinkNode("b");
LinkNode nodec = new LinkNode("c");
LinkNode noded = new LinkNode("d");
LinkNode nodee = new LinkNode("e");
LinkNode nodef = new LinkNode("f");
head.setNext(nodeb);
nodeb.setNext(nodec);
nodec.setNext(noded);
noded.setNext(nodee);
nodee.setNext(nodef);
nodef.setNext(null);
return head;
}
}
package edu.fjnu.service;
import edu.fjnu.domain.LinkNode;
public class NodeMethod {
/**
* 打印函数,打印当前结点的data值
* @param node 当前结点
* @author Harry
*/
public void printValue(LinkNode node){
while(node != null){
System.out.print(node.getData()+" ");
node = node.getNext();
}
// if(node == null){
// System.out.println("null");
// }
}
/**
* 链表倒置函数 每一步所执行的操作,把当前结点取出来,指向原本的头结点
* @param head 头结点
* @return 倒置后的头结点
* @author Harry
*/
public LinkNode reverse(LinkNode head){
if(head != null) {
LinkNode h = head ;
LinkNode x = head.getNext();
LinkNode y = null;
h.setNext(null);
while(x.getNext() != null){
y = x.getNext();
x.setNext(h); //把当前结点的头结点,变成当前结点的next
h = x;
x = y;
}
x.setNext(h); //原本的最后一个结点,未进入到循环,手动设置
return x;
}
return null;//如果沒有循环,抛出空
}
}
package edu.fjnu.domain;
/**
*
* @author Harry
*
*/
public class LinkNode {
private Object data; //结点值
private LinkNode next; //next结点
public LinkNode(Object data){
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public LinkNode getNext() {
return next;
}
public void setNext(LinkNode next) {
this.next = next;
}
@Override
public String toString() {
return "LinkNode [data=" + data + ", next=" + next + "]";
}
}
package edu.fjnu.client;
import edu.fjnu.domain.LinkNode;
import edu.fjnu.service.Init;
import edu.fjnu.service.NodeMethod;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
LinkNode head = new Init().InitNode();
NodeMethod use = new NodeMethod ();
System.out.print("原先的结点是: ");
use.printValue(head);
System.out.println();
System.out.print("旋转后的结点是: ");
LinkNode nl = null;
use.printValue(nl);
use.printValue(use.reverse(nl));
use.printValue(use.reverse(head));
}
}
最后程序执行的结果:
原先的结点是: a b c d e f
旋转后的结点是: f e d c b a