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

本文介绍如何使用Java通过while循环实现单向链表的倒置操作,详细解析了链表节点的反转过程。经过操作,原链表a->b->c->d->e->f变为f->e->d->c->b->a。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我理解的链表倒置的意思应该是比如 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->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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值