链表

链表

单链表

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值