4.23Java自定义链表新增插入节点方法

4.23Java自定义链表新增插入节点方法

定义方法的形参:index索引、Object对象):

该表链表节点指向的对象

定义三个数据关系---up、temp(临时节点)、new(新节点)

上面这些写在方法中

链表方法说明:

代码实现:

    /*新增一个add方法---方法的重载,方法名相同,形参不同*/
   //定义好属性---new节点,temp临时节点,up节点---在几号索引位置插入什么对象值
   public void add(int index, Object obj){
       //传进来的对象就是新的节点---要插入的元素
       Node newNode = new Node(obj);
       //传进来的索引就是要插入的索引
       Node temp = getNode(index);
       //进行判断,判断临时节点不为空的情况
       if (temp != null){
           //将上一个节点的值赋值给一个Node对象,利用Node对象的方法进行节点指向的转换---我先指向你,你再去指向它,他在来指向我。绕一圈
           Node up = temp.previous;

           //新对象尾节点指向插入对象
           up.next = newNode;
           //插入对象的头节点指向up
           newNode.previous = up;

           //插入对象的尾节点指向temp临时对象
           newNode.next = temp;
           //临时temp对象的头节点指向插入对象
           temp.previous = newNode;
      }
  }
//类似冒泡排序

完整实例:

链表操作只涉及上下游两个节点,没有涉及头部和尾部节点

package com.MyCollection;

import java.util.LinkedList;

/**
* 自定义链表
* 增加插入节点
* @author Lucifer
*/
public class LcfLinkedList04 {

   private Node first;

   private Node last;

   private int size;

   /*新增一个add方法---方法的重载,方法名相同,形参不同*/
   //定义好属性---new节点,temp临时节点,up节点---在几号索引位置插入什么对象值
   public void add(int index, Object obj){
       //传进来的对象就是新的节点---要插入的元素
       Node newNode = new Node(obj);
       //传进来的索引就是要插入的索引
       Node temp = getNode(index);
       //进行判断,判断临时节点不为空的情况
       if (temp != null){
           //将上一个节点的值赋值给一个Node对象,利用Node对象的方法进行节点指向的转换---我先指向你,你再去指向它,他在来指向我。绕一圈
           Node up = temp.previous;

//           //考虑首节点和末节点的处理办法
//           //如果插入节点是0号位---判断,建立新的up对象,如果为temp的previous那么就是为空,所以直接建立对象指向它
//           if (index == 0){
//               first = newNode;
//               newNode.next = temp;
//               temp.previous = newNode;
//           }

           //新对象尾节点指向插入对象
           up.next = newNode;
           //插入对象的头节点指向up
           newNode.previous = up;

           //插入对象的尾节点指向temp临时对象
           newNode.next = temp;
           //临时temp对象的头节点指向插入对象
           temp.previous = newNode;

      }
  }

   /*链表的remove方法---修改节点指向即可*/
   //根据索引值拿到节点,进行判断,如果节点不为空,把自己删掉。删掉的方法是它的上一个节点直接指向它的下一个节点
   public void remove(int index){
       //创建临时节点,将获取到的节点信息赋值给临时节点
       Node temp = getNode(index);
       //进行判断---考虑第一个元素
       if (temp != null){
           //创建两个对象代表节点
           Node up = temp.previous; //创建一个Node对象代表上一个节点
           Node down = temp.next; //创建一个Node对象代表下一个节点
           if (up != null){
               up.next = down; //目标节点的上一个节点的尾节点直接指向目标节点的下一个节点
          }

           if (down != null){
               down.previous = up; //等于空为第一个元素,就不做这样的操作了
          }
           /*
           如果是0号索引的元素,只会执行down != null这一句
           这样的话上一个指针就是null,所以要为头部和尾部单独写一个方法
            */
           //被删除的元素是第一个
           if (index == 0){
               //头节点直接等于下一个尾节点
               first = down;
          }

           //被删除的元素是最后一个
           if (index == size - 1){
               //尾部节点等于上一个节点up
               last = up;
          }
           size--;
      }
  }

   public void add(Object obj){
       Node node = new Node(obj);
       if (first == null){
           first = node;
           last = node;
      }else {
           node.previous = last;
           node.next = null;
           last.next = node;
           last = node;
      }
       size++;
  }

   public Object get(int index){
       if (index < 0 || index > size - 1){
           throw new RuntimeException("索引数字不合法" + index);
      }
       //调用下面封装好的重置方法
       Node temp = getNode(index); //index是方法定义的形参
       return temp != null ? temp.element : null;
  }

   /*封装重置方法便于调用*/
   //形参是索引值、返回值是元素数据本身、返回值是一个临时节点---方法包括:访问修饰符、返回值类型、形参、返回值
   public Node getNode(int 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 i = 0; i > index; i++){
               temp = temp.next;
          }
      }
       return temp;
  }

   @Override
   public String toString(){
       StringBuilder sb = new StringBuilder("[");
       //TODO Auto-generated method stub
       Node temp = first;
       while (temp != null){
           sb.append(temp.element + ",");
           temp = temp.next;
      }
       sb.setCharAt(sb.length() - 1,']');
       return sb.toString();
  }

   public static void main(String[] args) {
       LcfLinkedList04 list = new LcfLinkedList04();

       /*使用add方法*/
       list.add("a");
       list.add("b");
       list.add("c");
       list.add("d");
       list.add("e");
       list.add("f");

       System.out.println(list);
       list.add(3,"Lucifer");
       System.out.println(list);
  }
}

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14695370.html