Java单链表和LinkedList的实现
一、单链表的实现
无头单向非循环链表
定义异常用于判断所给位置是否合法
Python
public class IndexNotLegal extends RuntimeException{
public IndexNotLegal(){
}
public IndexNotLegal(String smg){
super(smg);
}
}
class ListNode中包含当前节点的值和下一个节点指向
实现链表的头插,尾插,任意位置插入,查找,删除一个节点,打印,计数,清空
Python
import java.util.List;
public class MySingleList {
//节点
class ListNode{
public int val;
public ListNode next;
public ListNode(int val){
this.val = val;
next = null;
}
}
public ListNode head;//代表链表的头结点
//打印
public void display(){
ListNode cur = head;
while(cur!=null){
System.out.print(cur.val+"->");
cur = cur.next;
}
System.out.println();
}
//节点个数
public int size(){
int count = 0;
ListNode cur = head;
while(cur!=null){
count++;
cur = cur.next;
}
return count;
}
//头插
public void addFirst(int data){
ListNode node = new ListNode(data);
node.next = head;
head = node;
}
//尾插法
public void addLast(int data){
ListNode node = new ListNode(data);
if(head==null){
head = node;
return;
}
ListNode tail = head;
while(tail.next != null){
tail=tail.next;
}
tail.next = node;
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data){
//判断合不合法
try {
checkIndex(index);
}catch(IndexNotLegal e){
e.printStackTrace();
}
if(index==0){
addFirst(data);
return;
}
if(index == size()){
addLast(data);
return;
}
ListNode cur = findIndexSubOne(index);
ListNode node = new ListNode(data);
node.next = cur.next;
cur.next = node;
}
private void checkIndex(int index) throws IndexNotLegal{
if(indexsize()){
throw new IndexNotLegal("index不合法");
}
}
public ListNode findIndexSubOne(int index){
ListNode cur = head;
int count =0;
while(count!=index-1){
cur = cur.next;
count++;
}
return cur;
}
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key){
ListNode cur = head;
while(cur!=null){
if(cur.val==key){
return true;
}
cur = cur.next;
}
return false;
}
//删除出现关键字为key的节点
public void remove(int key){
if(head==null){
return;
}
ListNode del = head;
ListNode pre = head;
while(del!=null){
if(del.val==key){
pre.next = del.next;
del = del.next;
}else{
pre = del;
del = del.next;
}
}
if(head.val==key){
head = head.next;
return;
}//最后判断头结点
}
public void clear(){
ListNode cur = head;
while(cur!=null){
ListNode curN = cur.next;
cur.next = null;
cur = curN;
}
head = null;
}
}
二、LinkedList
1、介绍
LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。
LinkedList实现了List接口
LinkedList的底层使用了双向链表
LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
LinkedList比较适合任意位置插入的场景
2、方法介绍
add
插入到指定位置
addAll:尾插c 中的所有元素
remove
删除 index 位置元素
删除遇到的第一个 o
get:获取下标 index 位置元素
set:将下标 index 位置元素设置为 element
clear:清空
contains:判断 o 是否在线性表中
indexOf:返回第一个 o 所在下标
lastIndexOf:返回最后一个 o 的下标
subList:截取部分 list
三、LinkedList遍历方法
Python
public static void main1(String[] args) {
LinkedList list = new LinkedList();
list.add(1);
list.add(2);
list.add(1,3);
System.out.println(list);//直接打印
System.out.println("==============");
//foreach遍历
for(Integer x: list){
System.out.print(x+" ");
}
System.out.println();
System.out.println("============");
//for遍历
int size = list.size();
for (int i = 0; i
四、实现MyLikedList
无头双向链表
定义异常用于判断所给位置是否合法
public class IndexNotIllegal extends RuntimeException{
public IndexNotIllegal(){
}
public IndexNotIllegal(String smg){
super(smg);
}
}
方法实现
public class MyLinkedList {
static class ListNode{
public int val;
public ListNode prev;
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
public ListNode head;//头结点
public ListNode last;//尾节点
public int size(){
int size = 0;
ListNode cur = head;
while(cur!=null){
size++;
cur = cur.next;
}
return size;
}
public void display(){
ListNode cur = head;
while(cur!=null){
System.out.print(cur.val+" ");
cur = cur.next;
}
System.out.println();
}
public boolean contains(int key){
ListNode cur = head;
while(cur!=null){
if(cur.val==key){
return true;
}
cur = cur.next;
}
return false;
}
//头插法
public void addFirst(int data){
ListNode Node = new ListNode(data);
if(head==null){
head = last = Node;
}else{
Node.next = head;
head.prev = Node;
head = Node;
}
}
//尾插法
public void addLast(int data){
ListNode Node = new ListNode(data);
if(head==null){
head = last = Node;
}else{
last.next = Node;
Node.prev = last;
last = Node;
}
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data){
try{
checkIndex(index);
}catch(RuntimeException e){
e.printStackTrace();
}
if(index == 0){
addFirst(data);
return;
}
if(index == size()){
addLast(data);
return;
}
ListNode cur = findIndex(index);
ListNode node = new ListNode(data);
node.prev = cur.prev;
node.next = cur;
cur.prev.next = node;
cur.prev = node;
}
private ListNode findIndex(int index){
ListNode cur = head;
while(index!=0){
cur = cur.next;
index--;
}
return cur;
}
public void checkIndex(int index)throws IndexNotIllegal{
if(indexsize()){
throw new IndexNotIllegal("数组下标不合法");
}
}
//删除第一次出现关键字为key的节点
public void remove(int key){
ListNode cur = head;
while(cur!=null){
if(cur.val==key) {
if (cur == head) {
//处理头节点
head = head.next;
if(head != null){
head.prev = null;
}else{
last = null;
}
} else {
if (cur.next == null) {
//处理尾节点
cur.prev.next = cur.next;
last = last.prev;
} else {
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
}
}
return;//删完一个就跳出
}
cur = cur.next;
}
}
//删除所有值为key的节点
public void removeAllKey(int key){
ListNode cur = head;
while(cur!=null){
if(cur.val==key) {
if (cur == head) {
//处理头节点
head = head.next;
if(head != null){
head.prev = null;
}else{
last = null;
}
} else {
if (cur.next == null) {
//处理尾节点
cur.prev.next = cur.next;
last = last.prev;
} else {
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
}
}
}
cur = cur.next;
}
}
//得到单链表的长度
public void clear(){
ListNode cur = head;
while(cur!=null){
ListNode curN = cur.next;
cur.next = null;
cur.prev = null;
cur = curN;
}
head = last = null;
}
}
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!