1、单链表的概念
1、链表是最基本的数据结构,其存储的过程原理图如下图所示:
1.2、上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。
链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。
2、用java实现单链表
2.1、编写一个Node类来充当结点的模型。我们知道,其中有两个属性,1.存放数据的data,2.存放下一结点的引用:
/**
* 单链表的实现
*
* @author Xuan
*
*/
public class Node {
public Node() {
}
// 使用构造函数,在构造时就可以给data赋值
public Node(int data) {
this.data = data;
}
// 头节点
private Node head;
// 这里存的是比较简单的int类型
public int data;
// 存放节点的变量,默认为null
public Node next;
/**
* 增加操作
*
* @param data
*/
public void addNode(int data) {
// 实例化一个节点
Node newNode = new Node(data);
// 判断头节点是否为空,如果是空就给他赋值
if (head == null) {
head = newNode;
return;
}
// 接收head头指针的对象
Node temp = head;
// 遍历单链表,直到遍历到最后一个则跳出循环。
while (temp.next != null) {
// 往后移动一个节点,指向下一个节点
temp = temp.next;
}
// temp为最后一个节点或者是头节点,将其next指向新节点
temp.next = newNode;
}
/**
* @param index:删除第index个节点
* @return
*/
public boolean deleteNode(int index) {
if (index < 1 || index > length()) {
return false;
}
if (index == 1) {
head = head.next;
return true;
}
int i = 1;
Node preNode = head;
Node curNode = preNode.next;
while (curNode != null) {
if (i == index) {
preNode.next = curNode.next;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return false;
}
/**
*
* 在不知道头指针的情况下删除指定节点
* @param n
* @return
*/
public boolean deleteNode(Node n) {
if (n == null || n.next == null) {
return false;
}
int tmp = n.data;
n.data = n.next.data;
n.next.data = tmp;
n.next = n.next.next;
System.out.println("删除成功!");
return true;
}
/**
* 返回单链表长度
*
* @return
*/
public int length() {
int length = 0;
Node temp = head;
while (temp != null) {
length++;
temp = temp.next;
}
return length;
}
/**
* 打印单链表
*/
public void printList() {
Node tmp = head;
while (tmp != null) {
System.out.println(tmp.data);
tmp = tmp.next;
}
}
}
2.2、测试类:
public class test {
/**
* @param args
*/
public static void main(String[] args) {
Node xuan = new Node();
xuan.addNode(1);
xuan.addNode(2);
xuan.addNode(3);
xuan.printList();
}
}