【数据结构】模拟实现LinkedList

LinkedList是双向链表结构可以适用于任意插入场景下的插入和删除,效率较高,时间复杂度为O(1)。

模拟实现

java 复制代码
public class MyLinkedList {

    static class ListNode{
        private int val;//值域
        private ListNode prev;//前驱
        private ListNode next;//后继

        public ListNode(int val) {
            this.val = val;
        }
    }

    public ListNode head;//双向链表的头节点
    public ListNode last;//双向链表的尾节点
}

LinkedList常用方法

java 复制代码
//头插法
public void addFirst(int data)
    
//尾插法
public void addLast(int data)
    
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data)
    
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key)
    
//删除第一次出现关键字为key的节点
public void remove(int key)
    
//删除所有值为key的节点
public void removeAllKey(int key)
    
//得到链表的长度
public int size()
    
//清空链表
public void clear()

实现addFirst方法(头插法)

java 复制代码
public void addFirst(int data){
	ListNode node = new ListNode(data);
    //如果链表为空 插入的元素就是头节点和尾节点
	if (head==null){
		head = node;
		last = node;
	}else {
		node.next = head;//使node的后继是现在的头节点
		head.prev = node;//使现在的头节点的前驱是node
		head = node;//让node成为新的头节点
	}
}

实现addList方法(尾插法)

java 复制代码
public void addLast(int data){
	ListNode node = new ListNode(data);
    //和头插一样
	if (last==null){
		head = node;
		last = node;
	}else {
		last.next = node;//使现在尾节点的后继为node
		node.prev = last;//使node的前驱为现在的尾节点
		last = last.next;//让node成为尾节点
	}
}

实现size方法(求链表长度)

java 复制代码
public int size(){
	ListNode cur = head;
	int count = 0;
	while (cur!=null){
		count++;
		cur = cur.next;
	}
	return count;
}

实现addIndex方法(在任意位置插入元素)

java 复制代码
public void addIndex(int index,int data){
    //插入的位置如果为0 可以使用头插法
	if (index==0){
		addFirst(data);
		return;
	}
    //如果在最后一个位置插入 可以使用尾插法
	if (index==size()){
		addLast(data);
		return;
	}
    
	ListNode node = new ListNode(data);
    //判断要插入的下标是否合法
	if (index<0||index>size()){
		System.out.println("index 不合法"+index);
		return;
	}
	ListNode cur = head;
    //让cur走到要插入的位置
	while (index!=0){
		cur = cur.next;
		index--;
	}
	node.next = cur;
	cur.prev.next = node;
	node.prev = cur.prev;
	cur.prev = node;
}

实现contains方法(查找是否包含关键字key是否在单链表当中)

java 复制代码
public boolean contains(int key){
	if (head==null){
		return false;
	}
	ListNode cur = head;
	while (cur!=null){
		if (cur.val==key){
			return true;
		}
		cur = cur.next;
	}
	return false;
}

实现remove方法(删除第一次出现关键字为key的节点)

java 复制代码
public void remove(int key){
    ListNode cur = head;
    while (cur!=null){
        if (cur.val==key){
            //删除头节点
            if (cur==head){
                head = head.next;
                if (head==null){
                    //只有一个头节点
                    cur.prev=null;

                }else {
                    last=null;
                }
                }else {
                    if (cur.next!=null){
                        //删除中间节点
                        cur.prev.next=cur.next;
                        cur.next.prev=cur.prev;
                    }else {
                    //删除尾节点
                    cur.prev.next=cur.next;
                    last=last.prev;
                }
            }
            return;
        }else {
            cur=cur.next;
        }
    }
}

实现removeAllkey(删除所有值为key的节点)

java 复制代码
public void removeAllKey(int key){
    ListNode cur = head;
    while (cur!=null){
        if (cur.val==key){
            //删除头节点
            if (cur==head){
                head = head.next;
                if (head==null){
                    //只有一个头节点
                    cur.prev=null;
                }else {
                    last=null;
                }
                }else {
                    if (cur.next!=null){
                        //删除中间节点
                        cur.prev.next=cur.next;
                        cur.next.prev=cur.prev;
                	}else {
                    	//删除尾节点
                    	cur.prev.next=cur.next;
                    	last=last.prev;
                }
            }
            cur=cur.next;
        }else {
            cur=cur.next;
        }
    }
}

实现clear方法(清除链表)

java 复制代码
public void clear(){
    ListNode cur = head;
    while (cur!=null){
        ListNode curNew = cur.next;
        cur.prev=null;
        cur.next=null;
        cur = curNew;
    }
    head=null;
    last=null;
}
相关推荐
郝学胜-神的一滴8 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
不知名XL13 小时前
day50 单调栈
数据结构·算法·leetcode
cpp_250115 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_250115 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
TracyCoder12316 小时前
LeetCode Hot100(26/100)——24. 两两交换链表中的节点
leetcode·链表
季明洵16 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
only-qi16 小时前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表
cpp_250116 小时前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-16 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒16 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习