数据结构链表解析(我的数据结构和算法学习-单链表)
数据结构链表解析(我的数据结构和算法学习-单链表)/** * 单链表 */ public class SingleList { public static void main(String[] args) { SingleLinkedList singleLinkedList = new SingleLinkedList(); Node node1 = new Node(1 "name1" null); Node node2 = new Node(2 "name2" null); Node node3 = new Node(3 "name3" null); singleLinkedList.addNode(node1); singleLinkedList.addNode(
单链表结构如图:
单链表结构
单链表是由数据域和指针域组成的。
数据域用于存储具体的数据,指针域用于存储下一个节点对象地址,如果一个节点的指针域为空,则表示此节点为该单链表的尾节点。
转为代码就是:
public class Node {
/**
* 数据域,存储数据
*/
public int id;
/**
* 指针域,指向下一个节点
*/
public Node next;
}
单链表的特点
- 插入和删除的效率高,当插入或删除时只需要修改前后节点的指针域即可,而不用移动其他节点,时间复杂度为O(1)
- 随机查找效率低,需要从头开始一直往尾部遍历,直到找到需要的节点位置,时间复杂度为O(n)
- 内存方面,会消耗相对多的内存,因为每个节点不光要存储数据本身,还要存储下一个节点地址地址。还有就是链表可以不是连续的内存,这样会造成更多的内存碎片。
下面的代码简单实现了一个单链表的添加,修改,删除,查找,和查询长度操作,仅供参考。
Github代码在这里datastructure/SingleList.java at master · mengshaokun/datastructure · GitHub
/**
* 单链表
*/
public class SingleList {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
Node node1 = new Node(1 "name1" null);
Node node2 = new Node(2 "name2" null);
Node node3 = new Node(3 "name3" null);
singleLinkedList.addNode(node1);
singleLinkedList.addNode(node2);
singleLinkedList.addNode(node3);
singleLinkedList.printNodes();
Node node = singleLinkedList.queryNodeById(3);
System.out.println(node);
System.out.println("====================");
singleLinkedList.removeNodeById(2);
singleLinkedList.printNodes();
System.out.println("====================");
Node node222 = new Node(2 "name222" null);
singleLinkedList.modifyNodeById(node222);
singleLinkedList.printNodes();
System.out.println(singleLinkedList.size());
}
}
/**
* 单链表类
*/
class SingleLinkedList {
/**
* 单链表的头节点
*/
public Node head;
/**
* 初始化单链表
*/
public SingleLinkedList() {
this.head = new Node(0 null null);
}
/**
* 添加单链表
* @param node
*/
public void addNode(Node node) {
//循环遍历找到最后一个节点,
//把node放到最后一个节点的next中
Node temp = head;
while (true) {
if (temp.next == null) {
//将node放入链表的尾部
temp.next = node;
break;
}
//非尾部节点 temp往后移动
temp = temp.next;
}
}
/**
* 根据ID查询Node信息
* @param id
* @return
*/
public Node queryNodeById(int id) {
Node temp = head;
//遍历查找每个Node节点,匹配id
while (true) {
if (temp.next == null) {
System.out.println("未找到对应的节点信息");
return null;
}
if (temp.next.id == id) {
return temp.next;
}
temp = temp.next;
}
}
/**
* 根据id删除Node
* @param id
*/
public void removeNodeById(int id) {
Node temp = head;
while (true) {
if (temp.next == null) {
System.out.println("未找到节点信息");
break;
}
if (temp.next.id == id) {
//删除节点
//要删除的节点的前一个节点指向要删除的节点的后一个节点
temp.next = temp.next.next;
break;
}
//前一个节点指向当前节点,当前节点为后一个节点
temp = temp.next;
}
}
/**
* 根据ID修改Node信息
* @param node
*/
public void modifyNodeById(Node node) {
Node temp = head;
while (true) {
if (temp.next == null) {
System.out.println("未找到节点信息");
break;
}
if (temp.next.id == node.id) {
temp.next.name = node.name;
break;
}
temp = temp.next;
}
}
/**
* 获取单链表长度
* @return
*/
public int size() {
int size = 0;
Node temp = head;
while (true) {
if (temp.next == null) {
return size;
}
size ;
temp = temp.next;
}
}
/**
* 打印单链表所有节点
*/
public void printNodes() {
Node temp = head;
//循环遍历打印每个节点信息
while (true) {
//判断是否为最后一个节点,如果是则终止循环
if (temp.next == null) {
break;
}
System.out.println(temp.next.toString());
temp = temp.next;
}
}
}
/**
* 单链表的节点类
*/
class Node {
public int id;
public String name;
/**
* 指向下一个节点
*/
public Node next;
public Node(int id String name Node next) {
this.id = id;
this.name = name;
this.next = next;
}
@Override
public String toString() {
return "Node{"
"id=" id
" name='" name '\''
" next=" next
'}';
}
}