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());
}