自己实现单链表Link-通俗易懂

前言

链表在我们日常的开发过程中应该说是非常常见,各种网络框架用到的队列,底层用到的都是链表.相信有一句话大家都听书过:集合更适合查询操作,链表更适合频繁的插入,删除操作

这里写图片描述

实现单链表的思路

  1. 链表类,数据节点
  2. 节点类包含数据,和对下个节点的引用

完整代码

package com.cxx.list;
/**
 * @Author: cxx
 * 单链表
 * @Date: 2018/6/7 19:17
 */
public class MyLink<E> {
    //节点内部类
    private class Node{
        private Object data;//数据
        private Node next = null;//指向下个节点
        public Node(){
            data=null;
        }
        public Node(E data){
            this.data=data;
        }
    }

    private Node head;//头引用
    private Node rear;//尾引用
    private Node point;//临时指针
    private int length;//链表长度

    public MyLink(){
        head = new Node();
        rear = head;//尾部指向头部
        length=0;
    }

    //从尾部插入链表
    public void add(E elem){
        point = new Node(elem);
        //上一个的尾结点的下一个节点为新节点
        rear.next=point;
        //尾节点转化为新的节点
        rear=point;
        length++;
    }

    //遍历输出链表
    public void traverse(){
        //移动临时指针到头部
        point=head;
        if (head!=null){
            System.out.println("["+head.data+"]");
        }
        while (point.next!=null){
            System.out.println("-➜[" + point.next.data + "]");
            point=point.next;
        }
        System.out.println();
    }

    //获取链表的长度
    public int length(){
        return length;
    }

    //清除链表内容
    //java垃圾回收,当对象没有引用指向,则视为垃圾,清理时机由系统决定)
    public void clear(){
        while (head.next!=null){
            head.next=head.next.next;
        }
        rear=head;
        point=null;
        length=0;
        System.gc();//未必有用
    }

    //删除指定位置元素
    public void remove(int pos){
        if (pos>=0&&pos<length){
            point=movePoint(pos);
            Node tmp = point.next;
            point.next=tmp.next;
            length--;
        }else {
            System.out.println("删除失败,没指定位置元素");
        }
    }

    //更改指定位置元素
    public void set(int pos,E elem){
        if (pos>0&&pos<length){
            point=movePoint(pos);
            point.next.data=elem;
        }else {
            System.out.println("修改失败,没有指定位置元素");
        }
    }

    //移动到指定位置,私有方法
    private Node movePoint(int pos){
        if (pos<0) return head;
        if (pos>length) return rear;
        if (pos>=0&&pos<length){
            point=head;
            while (point!=null){
                if (pos==0) break;
                pos--;
                point=point.next;
            }
        }
        return point;
    }

    //连接两个链表
    public void connect(MyLink b){
        this.rear.next=b.head.next;
        this.length+=b.length;
        b.head=null;
    }
}

测试代码

package com.cxx.list;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
 * @Author: cxx
 * @Date: 2018/6/7 17:08
 */
public class MyLinkTest {
    public static void main(String[] args) {
        MyLink<Integer> myLink = new MyLink();
        for (int i = 0; i <10 ; i++) {
            myLink.add(i);
        }
        myLink.traverse();
        System.out.println(myLink.length());
        //myLink.remove(8);
        myLink.set(8,1);
        myLink.traverse();
    }
}

效果截图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值