前言
链表在我们日常的开发过程中应该说是非常常见,各种网络框架用到的队列,底层用到的都是链表.相信有一句话大家都听书过:集合更适合查询操作,链表更适合频繁的插入,删除操作
实现单链表的思路
- 链表类,数据节点
- 节点类包含数据,和对下个节点的引用
完整代码
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();
}
}