手工实现linkedlist 插入

博客介绍了节点插入操作,打断原节点间的链接,插入新节点并建立新链接。还增加了首尾节点插入功能,且在插入索引越界时会抛出异常,最后给出了一系列操作后的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将原来的up和temp之间的link打断,插入新的节点newNode,建立新的link。
增加首尾节点的插入,同时能够在插入索引越界的情况下,抛出异常。
在这里插入图片描述

package cn.yyq.mycollection;

public class YyqLinkedList03 {
	private Node first;// 第一个节点
	private Node last;// 最后一个节点
	private int size;
	
	public void remove(int index) {
		Node temp = getNode(index);
		if (temp!=null) {
			Node up = temp.previous;
			Node down = temp.next;
			if (up!=null) {
				up.next = down;
				
			}
			if (down!=null) {
				down.previous = up;
			}
			if (index==0) {//up==null ,被删除的是第一个元素
				first = down;//当前对象的下一个作为第一节点,可以写在if中的else里
				//如果index==2, first =down 结果为0-2的索引都被删掉
				
			}
			if (index==size-1) {//down==null,被删除的是最后一个元素
				last = up;//当前对象的上一个作为最后一个
			}
			size--;
		}
		
	}
	public void add(int index,Object obj) {
		Node newNode = new Node(obj);
		Node temp = getNode(index);
		if (index < 0 || index > size - 1) {
			throw new RuntimeException("索引数字不合法:" + index);}
		if(index == 0)//第一个结点插入
		{
			first.previous = newNode;
			newNode.next = first;
			newNode.previous = null;
			first = newNode;
		}
		if(index == size-1) //最后一个节点插入
			
		{
			last.next = newNode;
			newNode.previous = last;
			newNode.next = null;
			last = newNode;}
		else {//其他部分的插入
			Node up = temp.previous;
			up.next = newNode;
			newNode.previous = up;
			temp.previous = newNode;
			newNode.next = temp;

		}
		size++;

	}

	// [a,b,c]
	@Override
	public String toString() {// 输入toString之后跳出重写
		// [a,b,c] first = a , last = c
		// a,b,c
		// Node temp = first;第一种输出方法,没有[],每个元素都换行
		// System.out.println(temp.element);
		// while (temp!= null) {
		// temp = temp.next;}
		// return "";
		StringBuilder sb = new StringBuilder("[");
		Node temp = first;

		while (temp != null) {
			sb.append(temp.element + ",");
			temp = temp.next;// 直到为空时结束
		}
		sb.setCharAt(sb.length() - 1, ']');
		return sb.toString();
	}
	public Object get(int index) {
		if (index < 0 || index > size - 1) {
			throw new RuntimeException("索引数字不合法:" + index);

		}
		Node temp = getNode(index);
		
		return temp!=null?temp.element:null;//temp不等于空返回temp.element,否则返回为空;
	}
		
	public Node getNode(int index) { //封装在获取节点上
		Node temp = null;

		if (index <= (size >> 1)) {// 如果索取是前半部分从头开始找
			temp = first;
			for (int i = 0; i < index; i++) {
				temp = temp.next;
			}
		} else {//如果索取是后半部分从尾开始找
			temp = last;
			for (int i = size - 1; i > index; i--) {
				temp = temp.previous;
			}
		}
		return temp;
	}
	

	public void add(Object obj) {
		Node node = new Node(obj);
		if (first == null) {// 第一次往里面放
			// node.previous = null;
			// node.next = null; 写不写都没有关系
			first = node;
			last = node;

		} else {
			// 第二次往里面放 ["a","b","c"]
			node.previous = last;// 前一个节点是上次的最后一个
			node.next = null;

			last.next = node;// 新加的节点b
			last = node; // last = c
		}
		size++;//每add一次,size++

	}

	public static void main(String[] args) {
		YyqLinkedList03 list03 = new YyqLinkedList03();
		list03.add("a");
		list03.add("b");
		list03.add("c");
		list03.add("d");
		list03.add("e");
		list03.add("f");
		list03.remove(5);
		System.out.println(list03);
		list03.remove(0);
		System.out.println(list03);
		list03.remove(2);
		System.out.println(list03);
		list03.add(2,"gg");
		System.out.println(list03);
		System.out.println(list03.size);
		list03.add(3,"gg1");
		System.out.println(list03);
	}

}



输出结果为:
[a,b,c,d,e]
[b,c,d,e]
[b,c,e]
[b,c,e,gg]
4
[b,c,e,gg,gg1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值