java实现单向链表的创建、添加节点、显示链表、修改节点值、有序插入节点、获取节点个数、单链表反转、逆序打印、合并链表功能

Java实现单向链表。
实现链表创建、添加节点、删除节点、显示链表、修改节点值、有序插入节点、获取节点个数、单链表反转、逆序打印、合并链表功能。

import java.util.Stack;


public class SingleLInkedList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SingleLinkedListDemo s = new SingleLinkedListDemo();
		HeroNode node1 = new HeroNode(1, "张");
		HeroNode node2 = new HeroNode(2, "刘");
		HeroNode node3 = new HeroNode(3, "李");
		HeroNode node4 = new HeroNode(4, "王");
		s.addHeroNode(node1);
		s.addHeroNode(node2);
		s.addHeroNode(node3);
		s.nodeNums(s.getHead());
		System.out.println("--------------打印链表");
		s.showLinkedList(s.getHead());
		s.updataLinkedList(new HeroNode(3, "改李为宋"));
		s.updataLinkedList(node4);
		System.out.println("-------------打印修改id3后的链表");
		s.showLinkedList(s.getHead());
		s.delLinkedList(4);
		s.delLinkedList(3);
		//s.showLinkedList(s.getHead());
		s.delLinkedList(2);
		s.delLinkedList(1);
		System.out.println("------------打印删除节点后的链表");
		s.showLinkedList(s.getHead());
		System.out.println("---------------按序号插入");
		s.addReorder(node4);
		//s.showLinkedList(s.getHead());
		s.addReorder(node2);
		s.addReorder(node3);
		s.addReorder(node1);
		s.showLinkedList(s.getHead());
		s.nodeNums(s.getHead());
		s.findLastKNode(s, 2);
		System.out.println("-----------反转链表");
		s.linkedReverse(s.getHead());
		s.showLinkedList(s.getHead());
		System.out.println("----------逆序打印");
		s.linkedReverseUseStack(s.getHead());
		System.out.println("--------------合并");
		SingleLinkedListDemo s2 = new SingleLinkedListDemo();
		HeroNode node6 = new HeroNode(6, "赵");
		HeroNode node7 = new HeroNode(7, "钱");
		s2.addHeroNode(node6);
		s2.addHeroNode(node7);
		SingleLinkedListDemo.mergeLinkedList(s.getHead(), s2.getHead());
	}

}

class HeroNode{
	public int id;
	public String name;
	public HeroNode next;
	public HeroNode(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	@Override
	public String toString() {
		return "HeroNode [id=" + id + ", name=" + name + "]";
	}
	
}

class SingleLinkedListDemo {
	private HeroNode head =  new HeroNode(0, "");
	
	//头结点方便查找,定义一个方法获取头结点
	public HeroNode getHead() {
		return head;
	}
	//添加节点,注意定义的辅助节点为temp = head
	public void addHeroNode(HeroNode heroNode) { 
		HeroNode temp = head;
		while(true) {
			if(temp.next == null) {
				break;
			}
			temp = temp.next;
		}
		temp.next = heroNode;
	}
	//显示链表
	public void showLinkedList(HeroNode head) {
		if(head.next == null) {
			System.out.println("链表为空,无法显示");
			return;
		}
		HeroNode temp = head.next;
		while(true) {
			if(temp == null) {
				break;
			}
			System.out.println(temp);
			temp = temp.next;
		}
	}
	//修改链表节点数据
	public void updataLinkedList(HeroNode heroNode) {
		if(head.next == null) {
			System.out.println("链表为空,无法修改");
			return;
		}
		/*
		HeroNode temp = head.next;
		boolean flag = false;
		while(true) {
			if(temp.next == null && temp.id != heroNode.id) {
				break;
			}
			if(temp.id == heroNode.id) {
				flag = true;
				break;
			}else {
				temp = temp.next;
			}
		}
		if(flag) {
			temp.name = heroNode.name;
		}else {
			System.out.println("没有找到id为" + heroNode.id + "的节点");			
		}*/
		HeroNode temp = head;
		while(true) {
			if(temp.next.id == heroNode.id) {
				temp.next.name = heroNode.name;
				return;
			}else {
				temp = temp.next;
			}
			if(temp.next == null) {
				System.out.println("没有找到id为" + heroNode.id + "的节点");
				return;
			}
		}
	}
	//删除节点,注意定义的辅助节点为temp = head
	public void delLinkedList(int id) {
		HeroNode temp = head;
		/*
		boolean flag = false;
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.id == id) {
				flag = true;
				break;
			}else {
				temp = temp.next;
			}
		}
		if(flag) {
			temp.next = temp.next.next;
		}else {
			System.out.println("没有找到id为" + id + "的节点");
		}*/
		
		while(true) {
			if(temp.next.id == id) {
				temp.next = temp.next.next;
				return;
			}else {
				temp = temp.next;
			}
			if(temp.next == null) {
				System.out.println("没有找到id为" + id + "的节点");
				return;
			}
		}
		
	}
	//实现有序插入节点
	public void addReorder(HeroNode heroNode) {
		HeroNode temp = head;
		while(true) {
			if(temp.next == null) {
				heroNode.next = temp.next;
				temp.next = heroNode;
				break;
				}else if (temp.next.id > heroNode.id) {
					heroNode.next = temp.next;
					temp.next = heroNode;
					break;
					}else if (temp.id == heroNode.id) {
						System.out.println("节点" + heroNode.id + "已存在");
					}
			temp = temp.next;
		}
	}
	//获取链表中级节点个数
	public int nodeNums(HeroNode head) {
		int count = 0;
		HeroNode temp = head;
		while(true) {
			if(temp.next == null) {
				break;
			}
			count++;
			temp = temp.next;
		}
		System.out.println("节点个数" + count);
		return count;
	}
	//查找倒数第K个节点
	public HeroNode findLastKNode(SingleLinkedListDemo ss,int index) {
		if(ss.getHead().next == null || index > ss.nodeNums(ss.getHead())) {
			return ss.getHead();
		}
		HeroNode fast = ss.getHead().next;
		HeroNode slow = null;
		int i = 0;
		while(i  < index-1) {
			fast = fast.next;
			i++;
		}
		slow = ss.getHead().next;
		while(fast.next !=null) {
			fast = fast.next;
			slow = slow.next;
		}
		System.out.println("倒数第" + index + "个节点为" + slow);
		return slow;
	}
	// 单链表反转
	public void linkedReverse(HeroNode head) {
		if(head.next == null || head.next.next == null) {
			return;
		}
		HeroNode temp = head.next;
		HeroNode next = null;
		HeroNode reverseHead = new HeroNode(0, "");
		while(temp != null) {
			next = temp.next;
			temp.next = reverseHead.next;
			reverseHead.next = temp;
			temp = next;
		}
		head.next = reverseHead.next;
	}
	//栈实现逆序
	public void linkedReverseUseStack(HeroNode head) {
		if(head.next == null) {
			return;
		}
		Stack<HeroNode> stk = new Stack<HeroNode>();
		HeroNode temp = head.next;
		while(temp != null) {
			stk.push(temp);
			temp = temp.next;
		}
		while(stk.size() > 0) {
			System.out.println(stk.pop());
		}
	}
	//合并两个有序链表
	public static void mergeLinkedList(HeroNode head1, HeroNode head2) {
		if(head1.next == null || head2.next == null) {
			return;
		}
		HeroNode mergeHead = new HeroNode(0, "");
		HeroNode temp1 = head1.next;
		HeroNode temp2 = head2.next;
		HeroNode temp3 = mergeHead;
		while(temp1 != null || temp2 != null) {
			if(temp1 != null && temp2 == null) {
				temp3.next = temp1;
				temp1 = temp1.next;
			}else if(temp1 == null && temp2 != null) {
				temp3.next = temp2;
				temp2 = temp2.next;
			}else if(temp1.id < temp2.id) {
				temp3.next = temp1;
				temp1 = temp1.next;
			}else {
				temp3.next = temp2;
				temp2 = temp2.next;
			}
			temp3 = temp3.next;
		}
		SingleLinkedListDemo  sss = new SingleLinkedListDemo();
		sss.showLinkedList(mergeHead);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值