Java数据结构和算法——手写链表

关于链表的结构可以参考一下:
https://www.cnblogs.com/ysocean/p/7928988.html

完整代码

package data.structure;

/**
 * 链表的查找、添加与删除
 *
 */
public class MlnkSingleLinkList {
	
	private Node head;//头节点指针
	private Node last;//尾节点指针
	private int size;//链表长度
	
	/**链表插入元素
	 * @param data 插入的元素
	 * @param index 插入的位置
	 */
	public void insertNode(Object data, int index){
		if(index < 0 || index > size) {
			throw new IndexOutOfBoundsException("超出链表范围!");
		}
		Node insertNode = new Node(data);//构造一个新节点
		if (size == 0) {
			//空链表
			head = insertNode;
			last = insertNode;
		} else if (index == 0) {
			//插入头部
			insertNode.next = head;//将新插入的节点的next指向head
			head = insertNode;//头节点指针变成新插入的指针
		} else if (index == size) {
			//插入尾部
			last.next = insertNode;//尾节点的next指向插入的节点
			last = insertNode;//尾节点指针变成新插入的指针
		} else {
			//插入中间
			Node prevNode = getIndex(index - 1);//得到前置节点
			Node nextNode = prevNode.next;
			prevNode.next = insertNode;
			insertNode.next = nextNode;
		}
		
		size++;
		System.out.println("添加第 " + index + " 个节点:" + data);
	}
	
	/**链表删除元素
	 * @param index 删除的位置
	 */
	public void removeNode(int index) {
		if (index < 0 || index >=size) {
			throw new IndexOutOfBoundsException("超出链表节点范围!");
		}
		Node removeNode = null;
		if (index == 0) {
			//删除头节点
			removeNode = head;//暂存,用于返回
			head = head.next;//头节点后移
		} else if (index == size - 1) {
			//删除尾节点
			Node prevNode = getIndex(index -1);//得到倒数第二个节点
			removeNode = prevNode.next;//暂存,返回这个删除的节点
			prevNode.next = null;//将倒数第二个节点的next指向空
			last = prevNode;//倒数第二个节点变成尾节点
		} else {
			//删除中间节点
			Node prevNode = getIndex(index - 1);//前置节点
			Node nextNode = prevNode.next.next;//后置节点
			removeNode = prevNode.next;//暂存,用于返回
			prevNode.next = nextNode;
		}
		
		size--;
		System.out.println("删除第 " + index + " 个节点:" + removeNode.data);

	}
	
	/**链表查找元素
	 * @param index 查找的位置
	 * @return
	 */
	private Node getIndex(int index) {
		if (index < 0 || index >=size) {
			throw new IndexOutOfBoundsException("超出链表节点范围!");
		}
		Node temp = head;//从头开始找
		for (int i = 0; i < index; i++) {
			temp = temp.next;
		}
		return temp;
	}

	//链表的节点类
	private class Node {
		Object data;//每个节点的数据
		Node next;//每个节点指向下一个节点的连接
		
		Node(Object data){
			this.data = data;
		}
	}
	
	/**
	 * 输出链表
	 */
	private void printLinkList() {
		Node temp = head;//从头节点开始输出
		for (int i = 0; i < size; i++) {
			System.out.print(temp.data + " ");
			temp = temp.next;
		}
		System.out.println("");
	}
	
	public static void main(String[] args) {
		MlnkSingleLinkList linkList = new MlnkSingleLinkList();
		System.out.println("===========准备添加节点=========");
		linkList.insertNode(1, 0);
		linkList.insertNode(3, 1);
		linkList.insertNode(5, 2);
		linkList.insertNode(7, 3);
		linkList.insertNode(9, 2);
		System.out.println("===========添加节点后的链表=========");
		linkList.printLinkList();
		System.out.println("===========准备删除节点=========");
		linkList.removeNode(2);
		System.out.println("===========删除节点后的链表=========");
		linkList.printLinkList();
	}
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值