手工实现LinkedList

论坛 期权论坛 脚本     
匿名技术用户   2021-1-9 08:38   825   0

https://blog.csdn.net/qq_40301026/article/details/86773133

参照其底层代码,按照自己的理解实现了LinkedList的一些基本功能。

如果对c和c++指针了解一下,理解起来非常快。

package cn.liu.MyLinkedList;

//结点
public class Node {
 Node prevoius;//上一个节点
 Node next;//下一个节点
 Object element;//数据
 
 //一个全参构造器
 public Node(Node prevoius, Node next, Object element) {
  super();
  this.prevoius = prevoius;
  this.next = next;
  this.element = element;
 }
 
 //构造器,来传数据
 public Node(Object element) {
  super();
  this.element = element;
 }
 
 
}
package cn.liu.MyLinkedList;

/**
 * 自定义一个链表
 * @author Dick
 *
 */

public class MyLinkedList<E> {
 //链表的头和尾,没有实例化
 private Node first;
 private Node last;
 private int size;//链表的长度
 
 //add函数,每一个加在链表尾
 public void add(E obj) {
  Node node  = new Node(obj);//把数据已经装到此结点里
  
  if(first==null)
  {
   //链表为空的话,它的前面和后面指向都为空
   node.prevoius = null;
   node.next = null;
   
   //它是链表的第一个也是最后一个元素
   first = node;
   last = node;
  }
  else
  {
   //本结点的前驱和后驱处理
   node.prevoius = last;
   node.next = null;
   
   //上一个结点指向本结点, 然后设置node为链表最后一个结点
   last.next = node;
   last = node;
  }
  size++;
 }

 //add函数,在指定位置插入一个结点
 //先通过index找到位置,再插入
 public void add(E obj,int index) {
  Node newnode = new Node(obj);//新建一个结点
  Node temp = getnode(index);//找到指定结点
  
  if(index == 0)//第一个结点
  {
   first.prevoius = newnode;
   newnode.next = first;
   newnode.prevoius = null;
   first = newnode;
  }
  else //其他结点
  {
   //newnode前面结点的操作
   temp.prevoius.next = newnode;
   newnode.prevoius = temp.prevoius;
   
   //newnode后面结点的操作
   temp.prevoius = newnode;
   newnode.next = temp;
  }
  size--;
 }
 
 //判断索引是不是合法
 public void judge(int index) {
  if(index < 0 ||index>size-1)
  {
   throw new RuntimeException("索引数字不合法:"+index);
  }
 }
 
 //找到某个节点
 public Node getnode(int index) {
  judge(index);
  Node temp = null;
  
  if(index<=(size>>1))//从前面查找
  {
   temp = first;
   for(int i=0;i<index;i++)
   {
    temp = temp.next;
   }
  }
  else//从后面查找
  {
   temp = last;
   for(int j = size-1 ;j>index;j--) {
    temp = temp.prevoius;
   }
  }
  return temp;
 }
 
 //get函数
 public Object get(int index) {
  judge(index);
  return getnode(index).element;
 }
 
 //toString函数重写
 @Override
 public String toString() {
  StringBuilder   sb = new StringBuilder("[");
  Node  temp = first;
  while(temp!=null){
   sb.append(temp.element+",");
   temp = temp.next;
  }
  sb.setCharAt(sb.length()-1, ']'); 
  
  return sb.toString();
 }
 
 //remove函数 移除指定结点
 public void remove(int index) {
  judge(index);
  Node temp = getnode(index);
  
  if(temp!=null)
  {
   Node one = temp.prevoius;//temp前一个节点
   Node two = temp.next;//temp后一个结点
   
   //被删除结点为首结点
   if(index==0)
   {
    two.prevoius = null;
    first = two;
   }
   //被删除结点为尾结点
   if(index == size-1)
   {
    one.next = null;
    last = one ;
   }
   //被删除结点为中间的结点
   if(one!=null)
   {
    one.next = two;
   }
   if(two!=null)
   {
    two.prevoius = one;
   }
   
   size--;
  }
 } 
 
  
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP