package LINKLIST;
class SINGLELISTDEMO {
public static void main(String[] args){
HERONODE heronode1 = new HERONODE(1,"松江","及时雨");
HERONODE heronode2 = new HERONODE(2,"卢俊义","玉麒麟");
HERONODE heronode3 = new HERONODE(3,"吴用","智多星");
HERONODE heronode4 = new HERONODE(4,"林冲","豹子头");
SIGNLELINKLIST signlelinklist = new SIGNLELINKLIST();
// signlelinklist.add(heronode1);
// signlelinklist.add(heronode2);
// signlelinklist.add(heronode3);
// signlelinklist.add(heronode4);
signlelinklist.addByOrder(heronode1);
signlelinklist.addByOrder(heronode4);
signlelinklist.addByOrder(heronode4);
signlelinklist.addByOrder(heronode2);
signlelinklist.addByOrder(heronode3);
signlelinklist.list();
//测试修改结点的代码
HERONODE newHERONODE = new HERONODE(2,"小卢","玉麒麟~");
signlelinklist.upDate(newHERONODE);
System.out.println("修改后的链表");
signlelinklist.list();
//删除一个结点
signlelinklist.DElete(1);
signlelinklist.DElete(4);
signlelinklist.DElete(4);
System.out.println("删除后链表的情况~");
signlelinklist.list();
//查找一个结点
System.out.println("查找结点~");
signlelinklist.check(2);
}
}
class HERONODE {
public int no;
public String name;
public String nickedname;
public HERONODE next;
public HERONODE(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickedname = nickname;
}
@Override
public String toString() {
return "HERONODE [no = " + no + ",name=" + name + ",nickname=" + nickedname + "]";
}
}
/*管理结点*/
class SIGNLELINKLIST{
/*初始化一个头结点*/
private HERONODE head = new HERONODE(0, " "," ");
//添加节点,
// 当不考虑编号的顺序时候,
// 找到当前链表结点的最后
//将最后这个结点的next 指向 新的结点
public void add(HERONODE heronode){
//头节点不能动,需要一个赋值变量temp
HERONODE temp = head;
//遍历链表找到最后
while (true){
//找到链表的最后
if(temp.next == null){
break;
}
//如果找不到就后移
temp = temp.next;
}
//当退出while循环时,temp就指向链表的最后
temp.next = heronode;
}
//第二种添加英雄时,根据排名将英雄插入到指定的位置
//(如果有这个排名,则添加失败并给出提示)
public void addByOrder(HERONODE heronode){
//通过一个辅助指针帮助找到添加的位置
//因为是单链表所以temp是位于添加的前一个位置,否则插入不了
HERONODE temp = head;
boolean flag = false;//flag标识添加的编号是否存在默认为false
while(true){
if(temp.next == null){//说明temp已经在链表的最后
break;//
}
if(temp.next.no > heronode.no){//位置找到,就在temp的后面插入
break;
} else if (temp.next.no == heronode.no) {//说明希望添加的编号已经存在
flag = true;
break;
}
temp = temp.next;//后移遍历当前的链表
}
//判断flag的值
if(flag){//不能添加,编号已经存在
System.out.println("准备添加的编号"+heronode.no+"已经存在,重复不能加入");
}
else {
heronode.next = temp.next;
temp.next = heronode;
}
}
//修改编号的信息,根据no来修改,即no不能修改
public void upDate(HERONODE NEWheronode){//根据newheronode的no来修改即可
//判断链表是否为空
if(head.next == null){
System.out.println("链表为空");
return;
}
//需要找到要修改的结点,根据no编号
//定义一个辅助变量
HERONODE temp = head.next;
boolean flag = false;//表示是否找到该节点
while (true){
if(temp == null){
break;
}
if(temp.no == NEWheronode.no){
//找到
flag = true;
break;
}
temp = temp.next;
}
//根据flag判断是否找到要修改的结点
if(flag){
temp.name = NEWheronode.name;
temp.nickedname = NEWheronode.nickedname;
}
else{
System.out.println("没有找到编号"+NEWheronode.no+",不能修改");
}
}
//删除结点的信息
//head结点不能动,需要找到被删除的结点的前一个结点
//需要找到删除结点的前一个结点,temp.next = temp.next.next,被删除的结点会被垃圾回收机制
public void DElete(int no){
HERONODE temp = head;
boolean flag = false;//标记是否找到待删除结点
while (true){
if(temp.next == null){//已经到链表的最后,推出
break;
}
if(temp.next.no == no){//找到待删除的节点前一个结点
flag = true;
break;
}
temp = temp.next;
}
if(flag){//找到
temp.next = temp.next.next;
}
else{
System.out.println("要删除的结点"+no+"不存在");
}
}
//查找
public void check(int no){
HERONODE temp = head;
boolean flag = false;
while (true){
if(temp.next == null){
break;
}
if(temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.println("该节点的no:" + temp.next.no + ",name:" +
temp.next.name + ",nickname:" + temp.next.nickedname);
}
else{
System.out.println("要查找的结点"+no+"不存在");
}
}
//验证
public void list(){
//先判断链表是否为空
if(head.next == null){
return;
}
//头节点不能动,需要一个辅助变量遍历
HERONODE temp = head.next;
while (true){
//判断是否到链表的最后了
if(temp == null){
break;
}
//输出结点的信息
System.out.println(temp);
//将next后移,fouze
temp = temp.next;
}
}
}
头插法和尾插法
package LINKLIST;
public class LinkList1 {
}
class ListNode{
int val;
ListNode next;
public ListNode(){}
public ListNode(int val){this.val = val;}
public ListNode(int val,ListNode next){this.val = val;this.next = next;}
}
class ming{
private ListNode head = new ListNode(-1);
/**
* 头插法
*
* @param node 待插入结点
*/
public void headInsert(ListNode node) {
//判断链表是否为空,若为空则将head.next指向node
if (head.next == null) {
head.next = node;
return;
}
//如果链表不为空,找到head.next,将node插入到head和head.next之间
ListNode temp = head.next;
head.next = node;
node.next = temp;
}
/**
* 尾插法
*
* @param node 待插入结点
*/
public void tailInsert(ListNode node){
ListNode temp = head;
while(true){
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
}