package com.datastructure;
/**
* 链表节点类
*
*/
public class ListNode {
int val;//节点值
ListNode next;//指向下一个节点的引用
ListNode(int x){
val=x;
}
}
package com.datastructure;
/**
* 双向链表节点
*/
public class ListNode2 {
int val;//节点值
ListNode2 next;//指向后继节点的引用
ListNode2 prev;//指向前驱节点的引用
ListNode2(int x){
val=x;
}
}
package com.datastructure;
/**
* 链表:由节点组成;-->ListNode
* 节点由值和指向下个节点的引用(指针)构成;-->val+next
* 链表的首个节点被称为头节点,最后一个节点被称为尾节点,尾结点指向null
* 链表比数组占用更多的内存空间
*
*
* 常见链表类型:
* 1.单向链表:节点包含值和指向下一节点的引用两项数据;将首个节点称为头节点,将最后一个节点称为尾节点,尾节点指向空 None
* 2.环形链表:令单向链表的尾节点指向头节点(首尾相接),则得到一个环形链表;在环形链表中,任意节点都可以视作头节点。
* 3.双向链表:双向链表记录了两个方向的引用;节点定义同时包含指向后继节点(下一个节点)和前驱节点(上一个节点)的引用(指针)
*
*
* 单向链表常见应用:
* 1.栈与队列
* 2.哈希表:链表地址解决哈希冲突、
* 3.图
*
*
* 双向链表应用场景:
* 1.高级数据结构:红黑树,B树
* 2.浏览器历史
* 3.LRU算法:快速找到最近最少使用的数据;以及支持快速添加和删除节点
*
* 环形链表:常用于需要周期性操作的场景,eg:操作系统资源调度
* 1.时间片轮换调度算法:它需要对一组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程
* 2.数据缓冲区:比如在音频、视频播放器中,数据流可能会被分成多个缓冲块并放入一个环形链表,以便实现无缝播放。
*
*/
public class LinkedList {
/**
* 1.初始化链表 (step1 初始化各个节点对象; step2构建节点之间的引用关系)
* 1->3->2->5->4
*/
public void initLinkedList(){
//初始化各个节点
ListNode n0=new ListNode(0);
ListNode n1=new ListNode(3);
ListNode n2=new ListNode(2);
ListNode n3=new ListNode(5);
ListNode n4=new ListNode(4);
//构建节点之间的引用
n0.next=n1;
n1.next=n2;
n3.next=n4;
}
/**
* 链表插入节点:只需更改两个节点引用指针
*
* 在链表节点n0之后插入节点P
*/
public void insert(ListNode n0,ListNode p){
ListNode n1=n0.next;
p.next=n1;
n0.next=p;
}
/**
* 删除链表的节点 n0之后的首个节点
* @param n0
*/
public void remove(ListNode n0){
if(n0.next==null)
return;
//n0->p->n1
ListNode p=n0.next;
ListNode n1=p.next;
n0.next=n1;
}
/**
* 访问节点
*
* 访问链表中索引为 index 的节点
* @param head
* @param index
* @return
*/
public ListNode access(ListNode head,int index){
for(int i=0;i<index;i++){
if(head==null)
return null;
head=head.next;
}
return head;
}
/**
* 遍历链表,查找其中值为 target 的节点,输出该节点在链表中的索引
* @param head
* @param target
* @return
*/
public int find(ListNode head,int target){
int index=0;
while(head!=null){
if(head.val==target){
return index;
}
head=head.next;
index++;
}
return -1;
}
public static void main(String[] args) {
}
}
详解链表的实现(Linkedlist)
于 2024-01-26 11:00:52 首次发布