JAVA数据结构与算法(一)单链表

JAVA数据结构与算法(一)单链表

1.单链表
链表是最基本的数据结构,其存储的你原理图如下图所示
在这里插入图片描述

链表的增加操作
在这里插入图片描述
链表的删除
在这里插入图片描述
链表的插入:
1、头插法:每次把新插入的节点当着头结点;
2、尾插法:每次把新插入的节点放在尾部;
3、指定位置插入法:每次在指定位置插入某个节点。
链表的删除:
删除指定位置上的某个节点
链表的查询:
1、根据节点位置查询该节点;
2、根据节点查询节点存放的位置

编写Node类

public class NodeDemo<T> {
	private class Node{
		private T data;     //存放结点数据
		private Node next;       //下个结点
		
		public Node() {}
		public Node(T data, Node next) {
			this.data = data;
			this.next = next;
		}
	}
	
	private Node head;//链表的头结点
	private Node tail;//链表的尾节点
	int size;
	
	public NodeDemo() {
		head = null;
		tail = null;
	}
	public NodeDemo(T data) {
		head = new Node(data, null);
		tail = head;
		size++;
	}

在尾部插入

public void addTailNode(T element) {
		if (head == null) {
			head = new Node(element, null);
			tail = head;
		}else {
			Node node = new Node(element, null);
			tail.next = node;
			tail = node;
		}
		size++;
	}

在头部插入

public void addHeadNode(T element){
		head = new Node(element, head);
		if (tail == null) {
			tail = head;
		}
	}

在指定位置插入

public void addIndexNode(T element, int index) {
		if (head == null) {
			addTailNode(element);
		}else {
			if (index == 0) {
				addHeadNode(element);
			}else {
				Node pre = findNodeByIndex(index-1);//找到要插入位置的前一个节点
				Node node = new Node(element, pre.next);
				//插入后pre的next指向新节点,新节点的next指向原来pre的下一个节点  
				pre.next = node;
				size++;
			}
		}
	}

根据结点查询节点存放的位置

public int findIndexByNode(T element) {
		Node current = head;
		int index = 0;
		while (current != null) {
			if (current.data.equals(element)) {
				return index;
			}
			current = current.next;
			index++;
		}
		return -1;
	}

根据节点位置删除指定位置的节点

public T deleteNode(int index) {
		Node dNode = null;
		if(index < 0 || index > size-1)  {  
            throw new IndexOutOfBoundsException("链表越界");  
        }
		if (index == 0) {
			dNode = head;
			head = head.next;
		}else {
			Node pre = findNodeByIndex(index-1);//获取要删除的节点的前一个节点
			dNode = pre.next;//要删除的节点就是pre的next指向的节点  
			pre.next = dNode.next;//删除以后pre的next指向被删除节点之前所指向的next  
			dNode.next = null;
		}
		return dNode.data;
	}

清空链表

public void clear() {
		head = tail = null;
		size = 0;
	}

判断链表是否为空

public boolean isEmpty() {
		return size == 0 ? true : false;
	}

打印链表

扫描二维码关注公众号,回复: 6210177 查看本文章
public String toString() {
		Node node = head;
		StringBuffer sb = new StringBuffer();
		while (node != null) {
			sb.append(node.data+" ");
			node = node.next;
		}
		return sb.toString();
	}

测试

public static void main(String[] args) {
		NodeDemo<String> nodeDemo = new NodeDemo<String>();
		nodeDemo.addTailNode("111");
		nodeDemo.addTailNode("222");
		nodeDemo.addTailNode("333");
		nodeDemo.addTailNode("444");
		System.out.println(nodeDemo);
		System.out.println("链表的size:" + nodeDemo.size);
		System.out.println("删除某个节点的位置:" + nodeDemo.findIndexByNode("333"));
		System.out.println("查询指定位置的节点:" + nodeDemo.findNodeByIndex(2).data);
		System.out.println("删除指定位置的节点:" + nodeDemo.deleteNode(2));
		System.out.println(nodeDemo);
		System.out.println("链表是否为空:" + nodeDemo.isEmpty());
		nodeDemo.clear();
		System.out.println("清空后的链表:" + nodeDemo);
		System.out.println("链表是否为空:" + nodeDemo.isEmpty());
	}

猜你喜欢

转载自blog.csdn.net/Tong_Nan/article/details/90140414