数据结构java实现单链表

java实现单链表常见操作

一、概述

本文主要总结单链表常见操作的实现,包括链表结点添加、删除;链表正向遍历和反向遍历、链表排序、判断链表是否有环、是否相交、获取某一结点等。

二、概念

链表:

一种重要的数据结构,HashMap等集合的底层结构都是链表结构。链表以结点作为存储单元,这些存储单元可以是不连续的。每个结点由两部分组成:存储的数值+前序结点和后序结点的指针。即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作。

单链表结构:
在这里插入图片描述
先定义一个节点

package com.example.demo.opera;

public class Node  {
    Node next = null;//下一个结点
    int data;//结点数据
    public Node(int data){
        this.data = data;
    }
}

package com.example.demo.service;
/*
* 定义一个单链表接口
* */
public interface Done {
    
    void addNode(int data);
  
    void printLink();

    int length();

    boolean deleteNode(int index);
}

单链表的相关增删遍历

package com.example.demo.opera;


import com.example.demo.service.Done;

/*
* 单链表操作
* */

public class Opera implements Done {
    /**链表的头结点*/
    Node head = null;

    /**
     * 链表添加结点:
     * 找到链表的末尾结点,把新添加的数据作为末尾结点的后续结点
     * @param data
     */
    public void addNode(int data){
        Node newNode = new Node(data);
        //如果头节点为空 新的节点就是头节点
        if(head == null){
            head = newNode;
            return;
        }
        //定义一个指针
        Node temp = head;
        //找到链表的末尾结点
        while(temp.next != null){
            temp = temp.next;
        }
        //将数据放到尾部节点
        temp.next = newNode;
    }
    /**
     * 打印结点
     */
    public void printLink(){
        //当前节点等于头节点
        Node curNode = head;
        while(curNode !=null){
            //打印当前节点
            System.out.print(curNode.data+" ");
            curNode = curNode.next;
        }
        System.out.println();
    }

    /**
     * 求链表的长度
     * @return
     */
    public int length(){
        int length = 0;
        Node curNode = head;
        while(curNode != null){
            length++;
            curNode = curNode.next;
        }
        return length;
    }

    /**
     * 链表删除结点:
     * 把要删除结点的前结点指向要删除结点的后结点,即直接跳过待删除结点
     * @param index
     * @return
     */
    public boolean deleteNode(int index){
        if(index<0 || index>length()){//待删除结点不存在
            return false;
        }
        if(index == 0){//删除头结点
            head = head.next;
            return true;
        }
        Node preNode = head;
        Node curNode = preNode.next;
        int i = 1;
        while(curNode != null){
            if(i==index){//寻找到待删除结点
                preNode.next = curNode.next;//待删除结点的前结点指向待删除结点的后结点
                return true;
            }
            //当先结点和前结点同时向后移
            preNode = preNode.next;
            curNode = curNode.next;
            i++;
        }
        return true;
    }

}
发布了5 篇原创文章 · 获赞 3 · 访问量 226

猜你喜欢

转载自blog.csdn.net/weixin_44819430/article/details/104692933