面试题之反转单链表(Java实现)

使用Java实现了单链表的反转,就不介绍单链表的结构了

如下图所示,上面的链表是原链表,将上面的链表反转成下面的链表。反转的前提是头结点的下一个节点不为空和下下个节点不为空,为空则不用反转

 实现思路

1,定义一个辅助变量temp,用于遍历原链表

2,定义一个新的链表的头结点newHead,将原链表遍历出来的结点放到newhead的后面,即将当前节点cur指向新的头结点

3,每遍历一个节点,就将该节点的next指向newHead的next

4,最后再将全部反转完的newHead的next指向头结点

代码实现

 package cn.mrlij.linkedlist;
/***
 * 单链表的实现
 * @author dreamer
 *
 */
public class SingleLinkedList {
	public static void main(String[] args) {
		SingleLinkedListDemo s = new SingleLinkedListDemo();
		HeroNode h1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode h2 = new HeroNode(3, "卢俊义", "玉麒麟");
		HeroNode h3 = new HeroNode(4, "吴用", "智多星");
		HeroNode h4 = new HeroNode(2, "林冲", "豹子头");
		s.addByOrder(h1);
		s.addByOrder(h2);
		s.addByOrder(h3);
		s.addByOrder(h4);
		System.out.println("转换前:");
		s.list();
		System.out.println("转换后:");
		reverseList(s.getHead());
		s.list();

	}
	
	/**
	 * 反转单链表
	 * 
	 */
	public static void reverseList(HeroNode head) {
		if(head.next==null||head.next.next==null) {//头结点或者下一个节点为空,不用反转
			return;
		}
		HeroNode cur = head.next;//定义辅助节点,帮助遍历单链表
		HeroNode next = null;//指向当前节点的下一节点
		HeroNode newHead = new HeroNode(0, "", "");//创建新的头结点
		while(cur!=null) {
			next = cur.next;//保存当前节点的下一节点
			cur.next = newHead.next;
			newHead.next =  cur;//将当前节点的下一节点指向新的头结点
			cur = next;
		}
		head.next = newHead.next;
	}
	
}
class SingleLinkedListDemo{
	//创建一个头结点,初始化数据,头结点不要动,不放具体的数据
	
	private HeroNode head = new HeroNode(0,"","");
	public HeroNode getHead() {
		return head;
	}
	//添加英雄
	public void add(HeroNode node) {
		//先找出最后的一个节点,把新加的节点放在最后一个节点的后面
		HeroNode temp = head;
		while(true) {
			if(temp.next == null) {
				break;
			}
			temp = temp.next;
		}
		temp.next = node;
	}
        //根据编号顺序添加英雄
	public void addByOrder(HeroNode node) {
		HeroNode temp = head;
		boolean flag = false;
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.no>node.no) {
				break;
			}else if(temp.next.no == node.no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			System.out.println("编号"+node.no+"已经存在了!");
		}else {
			node.next = temp.next;
			temp.next = node;
		}
	}
	public void list() {
		HeroNode temp = head;
		if(temp.next == null) {
			System.out.println("链表为空!");
			return;
		}
		while(true) {
			if(temp.next == null) {
				break;
			}
			System.out.println(temp.next);
			temp = temp.next; 
		}
	}
}
class HeroNode{
	public int no;//英雄编号
	public String name;//人名
	public String nickname;//绰号
	public HeroNode next;//下一个节点
	public HeroNode(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
	}
	

	
}

如有问题请与我联系,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值