链表
单链表
(1)直接在链表尾部插入
(2)按编号从小到大插入
(3)按编号删除节点
class Node //节点
{
public int no;
public String name;
public Node next; //指向后一个节点
public Node(int no, String name) //构造函数
{
this.no = no;
this.name = name;
}
}
class SingleLinkedList
{
private Node head = new Node(0, ""); //实例化链表头节点,一般不动
//直接在链表尾部插入
public void addEnding(int no, String name)
{
Node pre = head; //创建一个pre指向头节点
while (true)
{
if (pre.next == null) //找到最后一个节点
{
break;
}
pre = pre.next; //pre后移,指向下一个节点
}
Node cur = new Node(no, name); //实例化新节点
pre.next = cur; //最后一个节点的下一个节点是新节点
System.out.println("添加成功!");
return;
}
//按编号从小到大插入
public void addNum(int no, String name)
{
Node pre = head; //创建一个pre指向头节点
while (true)
{
if (pre.next == null) //链表为空或者所有节点的编号都小于新节点的编号
{
break;
}
if (pre.next.no == no) //已存在该编号,结束
{
System.out.println("该编号已存在,插入失败!");
return;
}
if (pre.next.no > no) //找到编号大于新节点的节点的上一个节点,在该节点后面插入
{
break;
}
pre = pre.next; //pre后移,指向下一个节点
}
Node cur = new Node(no, name); //实例化新节点
cur.next = pre.next; //新节点的下一个节点是当前节点的下一个节点
pre.next = cur; //当前结点的下一个结点是新节点,这两步骤不能交换位置
System.out.println("添加成功!");
return;
}
//按编号删除节点
public void delete(int no)
{
Node pre = head; //创建一个pre指向头节点
if (pre.next == null ) //链表为空,结束
{
System.out.println("链表为空,不能删除!");
return;
}
boolean flag = false; //flag标志是否有要删节点的编号
while (true)
{
if (pre.next == null) //已找到最后一个节点
{
break;
}
if (pre.next.no == no) //找到要删节点的前一个结点
{
flag = true; //找到要删节点的编号
break;
}
pre = pre.next; //pre后移,指向下一个节点
}
if (flag)
{
pre.next = pre.next.next; //要删除的前一个节点的next指向要删除的后一个节点
System.out.println("删除成功!");
}
else
{
System.out.println("没有该编号,删除失败!");
}
return;
}
//输出链表
public void show()
{
Node pre = head.next; //创建一个pre指向头节点
if (pre == null) //链表为空,结束
{
System.out.println("链表为空!");
return;
}
while (true)
{
if (pre == null) //已经没有节点了
{
break;
}
System.out.println("编号为" + pre.no + "的名称为" + pre.name);
pre = pre.next; //pre后移,指向下一个节点
}
return;
}
}
双向链表
(1)直接在链表尾部插入
(2)按编号排序插入
(3)按编号删除
class Node //节点
{
public int no;
public String name;
public Node prev; //指向前一个节点
public Node next; //指向后一个节点
public Node(int no, String name) //构造函数
{
this.no = no;
this.name = name;
}
}
class DoubleLinkedList
{
private Node head = new Node(0, ""); //实例化头节点
//直接在链表尾部插入
public void addEnding(int no, String name)
{
Node pre = head; //创建一个pre指向头节点
while (true)
{
if (pre.next == null) //找到最后一个节点
{
break;
}
pre = pre.next; //pre后移,指向下一个节点
}
Node cur = new Node(no, name); //实例化新节点
pre.next = cur; //最后一个节点的下一个节点是新节点
cur.prev = pre; //新节点的上一个节点是最后一个节点
System.out.println("添加成功!");
return;
}
//按编号排序插入
public void addNum(int no, String name)
{
Node pre = head; //创建一个pre指向头节点
while (true)
{
if (pre.next == null) //链表为空或者所有节点的编号都小于新节点的编号
{
break;
}
if (pre.no == no) //已存在该编号,结束
{
System.out.println("该编号已存在,插入失败!");
return;
}
if (pre.no > no) //找到编号大于新节点的节点,在该节点的前面插入
{
break;
}
pre = pre.next; //pre后移,指向下一个节点
}
Node cur = new Node(no, name); //实例化新节点
if (pre.next == null) //链表为空或者所有节点的编号都小于新节点的编号,直接在链表尾部插入
{
pre.next = cur;
cur.prev = pre;
}
else
{
cur.prev = pre.prev; //新节点的前一个节点是当前节点的前一个节点
cur.next = pre; //新节点的下一个节点是当前节点
pre.prev.next = cur; //当前节点的前一个结点的下一个节点是新节点
pre.prev = cur; //当前结点的前一个结点是新节点
}
System.out.println("添加成功!");
return;
}
//按编号删除
public void delete(int no)
{
Node pre = head; //创建一个pre指向头节点
if (pre.next == null ) //链表为空,结束
{
System.out.println("链表为空,不能删除!");
return;
}
boolean flag = false; //flag标志是否有要删节点的编号
while (true)
{
if (pre == null) //已经没有节点了
{
break;
}
if (pre.no == no) //找到要删节点
{
flag = true;
break;
}
pre = pre.next; //pre后移,指向下一个节点
}
if (flag)
{
pre.prev.next = pre.next; //要删除节点的前一个节点的下一个节点指向要删除的后一个节点
if (pre.next != null) //处理要删节点是最后一个节点的情况
{
pre.next.prev = pre.prev;
}
System.out.println("删除成功!");
}
else
{
System.out.println("没有该编号,删除失败!");
}
return;
}
//输出链表
public void show()
{
Node pre = head.next; //创建一个pre指向头节点
if (pre == null)
{
System.out.println("链表为空!");
return;
}
while (true)
{
if (pre == null)
{
break;
}
System.out.println("编号为" + pre.no + "的值为" + pre.name);
pre = pre.next;
}
return;
}
}