面试题三:使用 java 实现单向链表的倒置

来源:互联网 发布:mysql redis 实时同步 编辑:程序博客网 时间:2024/05/16 06:43
我理解的链表倒置的意思应该是比如 a->b 变成 b->a ,


核心算法不难,
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->nullLinkNode 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); //把当前结点的头结点,变成当前结点的nexth = 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;}@Overridepublic 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 

1 0
原创粉丝点击