Java中集合(四)LinkedList

本文介绍了一种自定义实现的链表数据结构,并通过具体的Java代码示例展示了如何添加、删除元素以及查找元素的位置。该链表实现了基本的双向链表功能,包括头节点和尾节点的操作。

一、概述

  1. 基于链表
  2. 内存空间不连续。增删较快,查询首尾特快 ,但是查询其他位置较慢
  3. 元素可以重复,列表中的元素会被自动编号
  4. 本身是线程不安全的集合
  5. 每一个元素都有三部分组成: 头部:存放上一个节点的地址   ,中部:存放数据  ,尾部: 存放下一个节点的地址
练习: 自己实现一个LinkedList  ,里面存放String类型的值
public class LinkedListDemo {
	/************************************************/
	// 定义一个节点类
	private class Node {
		Node prev;// 上一个节点
		String data;// 数据
		Node next; // 下一个节点

		public Node(Node prev, String data, Node next) {
			super();
			this.prev = prev;
			this.data = data;
			this.next = next;
		}

		public String getData() {
			return data;
		}

		public void setData(String data) {
			this.data = data;
		}

	}

	/************************************************/
	private Node frist; // 头节点
	private Node last;// 尾节点
	private int size;// 节点个数

	public LinkedListDemo() {
		// frist = last;
	}

	public void add(String str) {
		// 如果是头结点,直接指向新街点
		if (frist == null) {
			this.frist = new Node(null, str, null);
			// 因为只有以后各节点,所以头尾一致
			this.last = this.frist;
		} else {
			// 如果不是头结点 ,新街点指向原来的尾节点
			Node node = new Node(this.last, str, null);
			// 尾节点指向新街点
			this.last.next = node;
			this.last = node;
		}
		size++;
	}

	public void remove(int index) {
		
		// 判断下标越界
		if (index >=size||index<0) {
			throw new IndexOutOfBoundsException("Index:" + index);
		}
		// 记录要找的节点
		Node node = this.frist;
		for (int i = 0; i <index; i++) {
			node = node.next;
		}
		// 获取要删除的节点的上一个和下一个节点
		Node prev = node.prev;
		Node next = node.next;

		if(index==0){
			this.frist = next;
		}else if(index == size-1){
			this.last = prev;
		}else{
			// 把原本下一位的头结点指向上一位的尾节点
			prev.next = next;
			// 把原本上一位的尾节点指向下一位
			next.prev = prev;
			
		}
		// 元素个数少一
		size--;
	}

	public int indexOf(String str) {
		Node node = this.frist;
		for (int i = 0; i < size; i++) {
			if (node.data == str || str != null && str.equals(node.data)) {
				return i;
			}
			// 指向下一节点
			node = node.next;
		}
		return -1;
	}

	public void add(int index, String str) {
		Node node = new Node(null, str, null);
		// 判断下标是否越界
		if (index > size) {
			throw new IndexOutOfBoundsException();
		} else if (index == 0) {
			node.next = this.frist;
			this.frist = node;
		} else {
			// 查找占用这个位置的当前元素
			Node no = this.frist;
			for (int i = 0; i < index; i++) {
				no = no.next;
			}
			// 记录这个位置的前后节点
			Node prev = no.prev;
			Node next = no.next;
			// 在node和上一个节点之间插入一个元素
			prev.next = node;
			no.prev = prev;
			node.next = no;
			no.prev = node;
		}
		size++;
	}

	@Override
	public String toString() {
		Node node = this.frist;
		//System.out.println(node.data);
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(node.data+",");
			node = node.next;
		}
		String str = sb.toString();
		str = str.substring(0,str.length()-1);
		str += "]";
		return str;
	}
}
public static void main(String[] args) {
		LinkedListDemo l = new LinkedListDemo();
		//添加元素
		l.add("aa");
		l.add("bb");
		l.add("cc");
		l.add("dd");
		//向指定位置添加元素
		l.add(1, "ee");
		l.add(0, "ff");
		
		System.out.println(l);
		//移除元素
		
		l.remove(3);
		System.out.println(l);
		//获取指定元素的位置
		System.out.println(l.indexOf("aa"));
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值