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);
}
}