一、单链表
什么是链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。
每一个链表都包含多个节点,节点又包含两个部分,一个是数据域(储存节点含有的信息),一个是引用域(储存下一个节点或者上一个节点的地址)。
链表的特点是什么
不指定大小,扩展方便。链表大小不用定义,数据随意增删。
内存中非连续,内存利用率高
获取数据麻烦,需要遍历查找,比数组慢
方便插入、删除
二、双向链表
在单链表的基础上加上一个指向前驱节点的指针,实现双向访问
单链表的实现:
线性表节点定义:
1 public class Node<List> { 2 List data; 3 Node next; //下一节点指针 4 public Node(int data){ 5 this.data = data; 6 } 7 }
功能的实现:
1.遍历:
1 public void query(){ 2 if(head.next == null){ 3 System.out.println("空表"); 4 return; 5 } 6 //建立一个辅助节点来遍历单链表 7 Node temp = head.next; 8 while (temp != null){ 9 System.out.println(temp.data); 10 temp = temp.next; //移动temp下标 11 } 12 }
2.增加节点
1 public void add(Node newNode) { 2 //默认添加到双向链表的最后 3 Node temp = head; 4 while(true){ 5 if(temp.next == null){ 6 break; 7 } 8 temp = temp.next; 9 } 10 temp.next = newNode; 11 }
3.删除节点
关于temp节点:
在增删节点的时候,temp应该直接指向head节点,而不应该指向head.next
如:
1 public void add(Node newNode) { 2 //默认添加到双向链表的最后 3 Node temp = head.next; 4 while(true){ 5 if(temp == null){ 6 break; 7 } 8 temp = temp.next; 9 } 10 temp = newNode; 11 }
会导致节点添加失败!
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决