链表的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GaacuLKh-1610469021765)(30C6BB495DAC4DD4B8CC6927C8862AEC)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nICOA4zS-1610469021767)(D9C77D05D4514216A00195ACF10EFFA1)]
数组与链表的对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbnP80kz-1610469021769)(87EEC109582849D9AC9795B0095C4A5E)]
链表的功能
在指定为索引插入元素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5bXGnBK3-1610469021772)(63C83A5E47A64FE2888EE782F3904652)]
【实现】
public class LinkedList<E> {
private class Node{
public E e;
public Node next;
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node dummyHead;
private int size;
public LinkedList(){
dummyHead = new Node(null,null);
size = 0;
}
//获取链表中元素的个数
public int getSize(){
return size;
}
//返回链表是否为空
public boolean isEmpty(){
return size == 0;
}
//在链表指定索引的地方插入元素
public void add(int index,E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed.Illegal index");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
// Node node = new Node(e);
// node.next = prev.next;
// prev.next = node;
prev.next = new Node(e,prev.next);
size++;
}
//为链表头添加元素
public void addFirst(E e){
// Node node = new Node(e);
// node.next = head;
// head = node;
// head = new Node(e,head);
add(0,e);
}
// 在链表的末尾添加元素
public void addLast(E e){
add(size,e);
}
//获取链表中索引为 index 的元素
public E get (int index){
if(index < 0 || index > size){
throw new IllegalArgumentException("Get failed.Illegal index");
}
Node cur = dummyHead.next;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
return cur.e;
}
//获取链表的第一个元素
public E getFirst(){
return get(0);
}
//获取链表的最后一个元素
public E getLast(){
return get(size - 1);
}
//修改 index 位置的元素 为 e
public void set(int index,E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("Get failed.Illegal index");
}
Node cur = dummyHead.next;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
cur.e = e;
}
//查找链表中中是否存在元素 e 并返回索引 ,否则返回 -1
public int Contains(E e){
Node cur = dummyHead.next;
for (int i = 0; i < size; i++) {
cur = cur.next;
if(e.equals(cur.e)){
return i;
}
}
return -1;
}
//链表中元素的删除
public E remove(int index){
if(index < 0 || index > size){
throw new IllegalArgumentException("Get failed.Illegal index");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node retNode = prev.next;
prev.next = retNode.next;
retNode.next = null;
size--;
return retNode.e;
}
//删除链表的第一个元素
public E removeFirst(){
return remove(0);
}
//删除链表的最后一个元素
public E removeLast(){
return remove(size - 1);
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("LinkedList: size = %d\n",size));
res.append("[");
Node cur = dummyHead.next;
while(cur != null){
res.append(cur + "->");
cur = cur.next;
}
res.append("NULL");
res.append("]");
return res.toString();
}
}
复杂度分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmCE4tZf-1610469021775)(29BDF76A9CB74B35B307D48649A9FCF9)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6iCrokY-1610469021779)(B2BE00FDDD1B4B8FA9C08342C8413AE3)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2uKQO2C-1610469021783)(6882DABD9BC748C3BDFB9BB3CCAD8ECB)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kOwcsjAp-1610469021784)(FE873ACF3E1042688CF318866890821B)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHPHzopc-1610469021786)(32B175A293DC4868BDCEBC012F35E1DE)]
该博客主要围绕链表展开,介绍了链表的结构,对比了数组与链表,阐述了链表在指定索引插入元素等功能,还进行了实现及复杂度分析,涉及数据结构和算法相关知识,以 Java 语言为背景。

4174

被折叠的 条评论
为什么被折叠?



