Java单链表[增删改查]

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java单链表[增删改查]相关的知识,希望对你有一定的参考价值。

  • 添加节点 addIndex(int index,int val);在单链表任意index位置添加元素val   ps:找待插入位置的前驱;
  • 查找元素 get(int index);根据inedx查找对应的值;
  • 修改节点 set(int index,int newVal);当前链表中索引为 index 的节点值改为newVal;
  • 删除节点 removeIndex(int index);删除单链表中指定索引对应的元素;

 代码: 

package seqlist;
/**
 * 火车类,有多个车厢拼接在一起
 */
public class SingleLinkedList 
    private int size;
    private Node head;

    /**
     * 在火车头部添加元素——添加一个车厢节点
     * @param val
     */
    public void addFirst(int val)
        //新建一个车厢节点
        Node node = new Node(val);
        //判断火车是否为空
        if(head == null)
            //火车为空
            head = node;
        else
            //火车中有节点,新车厢挂在火车头部
            node.next=head;
            head=node;
        
        //最后火车车厢++
        size++;
    
    /**
     * 在单链表任意index位置添加元素val
     * @param index
     * @param val
     */
    public void addIndex(int index,int val)
        //合法性
        if (index < 0 || index > size)
            System.err.println("add index illegal!");
            return;
        
        //头插  调用 addFirst
        if (index == 0)
            addFirst(val);
            return;
        
        //插入元素 先创建一个新节点
        Node node = new Node(val);
        //找到待插入位置的前驱,从头节点依次向后走index-1步(遍历)\\
        Node prev = head;
        for (int i = 0; i < index-1; i++) 
            prev=prev.next;
        
        //插入 prev 指向的是待插入位置的前驱节点
        node.next = prev.next;
        prev.next = node;
        size++;
    
    /**
     * 在单链表尾部插入元素,直接调用addIndex方法
     * @param val
     */
    public void addLast(int val)
        addIndex(size,val);
    

    /**
     * 根据inedx查找对应的值
     * @param index
     * @return
     */
    public int get(int index)
        //判断合法性(单独弄个方法)
        if (rangeCheck(index))
            Node node = head;
            //遍历单链表,从头到index
            //规定node节点走的步数
            for (int i = 0; i < index; i++) 
                node=node.next;
            
            return node.val;
        else
            System.err.println("get index illegal!");
            return -1;
        
    

    /**
     * 判断当前单链表是否包含值为 val 的节点
     * @param val
     * @return
     */
    public boolean contains(int val)
        for (Node temp = head;temp != null;temp =temp.next)
            if (temp.val==val)
                return true;
            
        
        return false;
    

    /**
     * 当前链表中索引为 index 的节点值改为newVal
     * @param index
     * @param newVal
     * @return 修改之前的值
     */
    public int set(int index,int newVal)
        if (rangeCheck(index))
            Node node = head;
            for (int i = 0; i < index; i++) 
                node=node.next;
            
            int oldVal = node.val;
            node.val=newVal;
            return oldVal;
        else
            System.err.println("set index illegal!");
            return -1;
        
    

    /**
     * 删除单链表中指定索引对应的元素
     * @param index
     */
    public void removeIndex(int index)
        if (rangeCheck(index))
            //边界 删除头节点的情况
            if (index==0)
                Node temp = head;
                head = head.next;
                temp.next = null;
                size--;
            else
                //删除中间位置
                Node prev = head; //prev待删除节点的前驱
                for (int i = 0; i < index-1; i++) 
                    prev=prev.next;
                
                Node cur = prev.next; //待删除节点
                prev.next = cur.next;
                cur.next = null;
                size--;//车厢有效元素size--
            
        else
            System.err.println("remove index illegal!");
        
    
    /**
     * 删除头节点  令其index为0即可
     */
    public void removeFirst()
        removeIndex(0);
    

    /**
     * 删除尾节点  令其index为 size-1 即可
     */
    public void removeLast()
        removeIndex(size-1);
    

    /**
     * 删除第一次出现的val值
     * @param val
     */
    public void removeValueOnce(int val)
        // 遍历链表,找到值为val的节点 -> 不知道值为val的节点在哪个位置
        // 找到后删除(正常的删除都需要找到前驱,只有头节点没前驱)
        if (head!=null && head.val==val)
            // 头节点就是待删除的节点
            Node temp = head;
            head = head.next;
            temp.next = null;
            size--;
        else
            // 此时head一定不是待删除的节点
            Node prev = head;
            // 判断前驱的下一个节点值是否等于val
            // 看你取值用的是哪个引用,就判断哪个引用不为空
            while (prev.next!=null)
                if (prev.next.val==val)
                    // cur就是待删除的节点
                    Node cur = prev.next;
                    // 删除cur
                    prev.next = cur.next;
                    cur.next = null;
                    size--;
                    return;
                
                prev=prev.next; //prev不是待删除节点的前驱,prev向后移动
            
        
    

    /**
     * 删除单链表中所有val节点
     * @param val
     */
    public void removeValueAll(int val)
        // 判断头节点是否是待删除节点
        while (head!=null && head.val==val)
            head=head.next;
            size--;
        
        if (head==null)
            return;
        else
            Node prev = head;
            while (prev.next!=null)
                if (prev.next.val==val)
                    Node cur = prev.next;
                    prev.next=cur.next;
                    cur.next=null;
                    size--;
                else 
                    prev=prev.next;
                
            
        
    

    /**
     * 打印单链表
     * @return
     */
    public String toString()
        String ret = "";
        //遍历火车这个类
        //从火车头 head 走到火车尾部
        //暂存当前头节点位置
        Node node = head;
        while(node!=null)
            ret += node.val;
            ret += "->";
            //继续访问下一节车厢
            node = node.next;
        
        ret += "NULL";
        return ret;
    

    /**
     * 检验合法性 (修改,查找,删除时使用)
     * @param index
     * @return
     */
    private boolean rangeCheck(int index) 
        if (index<0 || index >= size)
            return false;
        
        return true;
    


/**
 * 火车车厢类,一个车厢只能保存一个元素
 */
class Node
    int val; //存储具体数据
    Node next; // 保存下一个车厢的地址
    public Node(int val)
        this.val=val;
    

测试类

package seqlist;

public class Test 
    public static void main(String[] args)         
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.addFirst(1);
        singleLinkedList.addFirst(3);
        singleLinkedList.addFirst(5);
        singleLinkedList.addLast(4);
        System.out.println(singleLinkedList); //5->3->1->4->NULL
        singleLinkedList.removeIndex(2);
        System.out.println(singleLinkedList);//5->3->4->NULL
        singleLinkedList.addFirst(1);
        singleLinkedList.addFirst(3);
        singleLinkedList.addFirst(5);
        singleLinkedList.addLast(4);
        System.out.println(singleLinkedList);//5->3->1->5->3->4->4->NULL
        singleLinkedList.removeFirst();
        System.out.println(singleLinkedList);//3->1->5->3->4->4->NULL
        singleLinkedList.removeIndex(1);
        System.out.println(singleLinkedList);//3->5->3->4->4->NULL
        singleLinkedList.removeValueAll(4);
        System.out.println(singleLinkedList);//3->5->3->NULL
        singleLinkedList.removeValueOnce(3);
        System.out.println(singleLinkedList);//5->3->NULL
    

 源代码:

src/seqlist/SingleLinkedList.java · Wyuchan/javasjjg - Gitee.com


over~~

以上是关于Java单链表[增删改查]的主要内容,如果未能解决你的问题,请参考以下文章

数据结构单链表SingleLinkedList,Java实现单链表增删改查

单链表的增删改查(进阶版)

python实现单链表的增删改查

python实现单链表的增删改查

算法与数据结构单链表的增删改查逆序打印与输出合并有序链表

单链表之实现(以及增删改查)