java 自定义LinkedList增加 自定位置增加 移除 查找 方法(java笔记)

一,本篇适合初学者java 熟悉java基础以及对LinkedList初步认识

代码如下

Node类

/**2019-6-23
 * 本类为一个节点类 
 * 定义了一个节点包括节点头(previous),尾(next),节点(element)
 * 这里需要注意的是 这三个(previous  element next)组成一个节点
 */

public class Node {
	Node previous;
	Node next;
	Object element;
	
	//生成其构造方法(三个属性都有的)
	public Node(Node previous, Node next, Object element) {
		super();
		this.previous = previous;
		this.next = next;
		this.element = element;
	}
	//(只有一个element的构造方法)
	public Node(Object element) {
		super();
		this.element = element;
	}


主代码

package cn.sxt.LinkedList;

/**
 * 2019-6-23 第四版 *
 * 
 * @author lee
 * 
 */
public class TextLinkedList04<E> {
	// 定义第一个节点 和最后一个节点 以及链表长度
	private Node first;
	private Node last;
	private int size;

	// 定义一个插入的方法
	public void add(int index, E e) {
		check(index);// 输入数值不合法抛异常
		Node node = new Node(e);
		// 调用了getNode查找到目标对象
		Node temp = getNode(index);
		// 如果在第一个节点插入。那么新节点的“尾”node.next指向第一个节点
		// 第一个节点的“头”指向新节点
		// 新节点就变成了这个链表中的第一个节点
		if (index == 0) {
			node.next = first;
			first.previous = node;
			first = node;
			size++;
		}
		// 如果在中间插入
		if (index < size - 1 && index != 0) {
			if (temp != null) {
				temp.previous.next = node;
				temp.previous = node;
				node.next = temp;
				node.previous = node;
				size++;
			}

		}
		// 如果在最后一个节点插入
		// 这里直接调用add(index)方法,add(index)方法本质就是在最后一个节点位置插入
		if (index == size - 1) {
			last = temp;
			add(e);
		}
	}

	// remove (移除操作)
	public void remove(int index) {
		// 先查找到然后删除
		check(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) {
				first = down;
			}
			// 删除最后一个
			if (index == size - 1) {
				last = up;
			}

			size--;// 删除一个元素size--
		}

	}

	// 单独定义一个检测索引是否合法的方法 私有在本类中使用
	private void check(int index) {
		if (index < 0 || index > size - 1) {
			throw new RuntimeException("位置不合法:" + index);
		}
	}

	// get
	public Object get(int index) {
		// 输入数值不合法抛异常
		check(index);

		Node temp = getNode(index);
		return temp != null ? (E) temp.element : null;
	}

	// 本方法不需要外部了解调用直接私有在本类中自己调用
	private Node getNode(int index) {
		Node temp = null;
		// 本方法为了快速定位到索引位置,如果查找的位置大于二分之一的size
		// 则采用从后向前索引的方式;
		if (index <= (size >> 1)) {// size>>1相当于size/2
			temp = first;
			for (int i = 0; i < index; i++) {
				temp = temp.next;
			}

		} else {
			// 当index>(size>>1)时从后向前的索引方式
			temp = last;
			for (int i = size - 1; i > index; i--) {
				temp = temp.previous;
			}

		}
		return temp;
	}

	// 写add方法
	public void add(E e) {
		// 定义一个新节点
		Node node = new Node(e);
		// 这里声名一个判断 如果没有第一个节点(也就是 first=null)的话
		// 那么第一个节点就是node 最后一个也是node
		if (first == null) {
			first = node;
			last = node;
		} else {
			// 否则的话这个新节点的“头”(node.previous)就指向了最后一个节点
			// 而这个节点的“尾”(node.next)就为空
			node.previous = last;
			node.next = null;
			// 而在链表中最后一个节点的“尾”(last.next)就指向了这个新节点
			last.next = node;
			// 由于上面的链接所以加的这个新节点就变成了链表中最后一个节点
			last = node;
		}
		size++;
	}

	// 写toString方法用于输出链表中的元素
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
		// 把这个链表的第一节点赋给temp准备从头输出
		// 通过while循环逐个输出
		Node temp = first;
		while (temp != null) {
			sb.append(temp.element + ",");
			temp = temp.next;
		}
		sb.setCharAt(sb.length() - 1, ']');
		return sb.toString();
	}

	public static void main(String[] args) {

		TextLinkedList04<String> list = new TextLinkedList04<>();
		// 调用add方法
		list.add("aa");
		list.add("bb");
		list.add("cc");
		list.add("ee");
		list.add("ff");
		list.add("gg");
		// //以下是对写的方法的测试
		// //调用toString方法
		// System.out.println("**************************");
		// System.out.println(list);
		// //调用get方法
		// System.out.println("**************************");
		// System.out.println(list.get(0));
		// //调用remove方法删除第一个节点
		// list.remove(0);
		// System.out.println("**************************");
		// System.out.println(list);
		// System.out.println(list.size);
		// //调用remove方法删除中间节点
		// list.remove(4);
		// System.out.println("**************************");
		// System.out.println(list);
		// System.out.println(list.size);
		// //调用add插入方法
		// list.add(2, "ss");
		// System.out.println("**************************");
		// System.out.println(list);
		// System.out.println(list.size);
		// //在第一个节点插入
		// list.add(0, "ps");
		// System.out.println("**************************");
		// System.out.println(list);
		// System.out.println(list.size);
		//
		// //在最后一个节点插入
		// list.add(5, "SS");
		// System.out.println("**************************");
		// System.out.println(list);
		// System.out.println(list.size);

	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值