1.模拟单链表首先要定义节点
class Node {
//数据域
public int no;//编号
public String name;//名称
//指针域
public Node next;//指向下一个节点
public Node(int no, String name) {
this.no = no;
this.name = name;
}
}
2.单链表的添加
2.1方式一 (不按照顺序 找到最后一个节点直接添加)
/*添加节点*/
public void addnode(Node node) {
//创建一个辅助类指针
Node temp = head;
//找到指针域为null的节点(最后一个节点)
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
//最后一个节点的next域指向要添加的节点
temp.next = node;
}
2.2方式二(找到一个节点(next域指向的编号大于要添加的节点) 先把节点的next域复制给要添加的节点,再修改该节点的next域)
/*按照编号顺序添加节点*/
public void addnodebynum(Node node) {
//创建一个辅助类指针
Node temp = head;
//记录编号是否相同
boolean flag = false;
//找到指针域为null的节点(最后一个节点)
while (true) {
if (temp.next == null) {
break;
}
//当前的编号小于下一个节点的编号
if (node.no < temp.next.no) {
break;
} else if (node.no == temp.next.no) {
flag = true;
break;
}
temp = temp.next;
}
//判断是否有相同的编号
if (flag) {
System.out.println("编号已存在");
} else {
//1.遍历出节点的next域-->新增的节点的next域 2.遍历出节点的next域指向要添加的节点
node.next = temp.next;
temp.next = node;
}
}
3.遍历单链表
/*遍历所有节点*/
public void getLinkList() {
//判断是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//辅助指针
Node temp = head.next;
while (true) {
//判断是否为最后一个节点
if (temp == null) {
break;
}
System.out.println(temp);
//后移一个
temp = temp.next;
}
}
4.根据编号删除节点(和根据编号增加类似)
/*按照编号删除节点*/
public void delnode(int no) {
Node temp = head;
boolean flag = false;
//找到需要删除节点的前一个节点 因为删除之后 被删除节点的前一个节点的next域需要改变
while (true) {
if (temp.next == null) {
break;
} else if (temp.next.no == no) {
//找到了待删除节点的前一个节点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
System.out.println("已删除" + no + "节点");
} else {
System.out.println(no + "节点没有找到");
}
}
效果:
.out.println(“已删除” + no + “节点”);
} else {
System.out.println(no + “节点没有找到”);
}
}
> ##### 效果:
>
> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PN1eNWOF-1582893894416)(https://raw.githubusercontent.com/yuanxuanchao/clouding/master/img/singlelinkedlist.png)]