评论

收藏

[Java] java实现简单单链表

编程语言 编程语言 发布于:2021-08-14 17:12 | 阅读数:536 | 评论:0

本文实例为大家分享了java实现简单单链表的具体代码,供大家参考,具体内容如下
一、定义:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(相当于JAVA中的引用,指示后继元素存储位置,),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
二、结构:
DSC0000.jpg

如图所示,data就是当前节点的数据,next是指针,指针存放的是内存地址,是当前结点的下一结点内存地址,顺着这个地址就能找到下一个结点。
三、代码实现:
package com.example.demo.linkedlist;
 
/**
 * 结点
 * Created by xinan on 2021/02/23
 */
public class Node {
 
  public Integer value;
 
  public Node next;
 
  public Node(Integer value) {
  this.value = value;
  }
 
  public Node(Integer value, Node next) {
  this.value = value;
  this.next = next;
  }
 
  public Integer getValue() {
  return value;
  }
 
  public void setValue(Integer value) {
  this.value = value;
  }
 
  public Node getNext() {
  return next;
  }
 
  public void setNext(Node next) {
  this.next = next;
  }
  
}
package com.example.demo.linkedlist;
 
 
/**
 * 单链表
 * Created by xinan on 2021/2/23
 */
public class SingleLinkedList {
 
  public Node head;
 
  /**
   * 从头部添加
   * @param data 待添加数据
   */
  public void addHead(Integer data) {
  Node node = new Node(data);
  node.next = head;
  head = node;
  }
 
  /**
   * 从尾部添加
   * @param data 待添加数据
   */
  public void addLast(Integer data) {
  Node node = new Node(data);
  if (head == null) {
    head = node;
    return;
  }
  Node temp = head;
  while (temp.next != null) {
    temp = temp.next;
  }
  temp.next = node;
  }
 
  /**
   * 获取链表的长度
   * @return 链表长度
   */
  public Integer length() {
  int length = 0;
  Node temp = head;
  while (temp != null) {
    temp = temp.next;
    length ++;
  }
  return length;
  }
 
  /**
   * 从指定下标处添加
   * @param index 指定下标
   * @param data 待添加的数据
   */
  public void addByIndex(int index, Integer data) {
  if (index < 0 || index > length()) {
    System.out.println("插入下标不合规,请检查!");
    return;
  }
  if (index == 0) {
    addHead(data);
    return;
  }
  Node node = new Node(data);
  Node temp = head;
  for (int i = 1; i < index; i++) {
    temp = temp.next;
  }
  node.next = temp.next;
  temp.next = node;
  }
 
  /**
   * 指定下标删除
   * @param index 指定下标
   */
  public void deleteByIndex(int index) {
  if (index < 0 || index > length()) {
    System.out.println("删除下标不合规,请检查!");
    return;
  }
  if (index == 0) {
    head = head.next;
    return;
  }
  Node temp = head;
  for (int i = 1; i < index; i++) {
    temp = temp.next;
  }
  temp.next = temp.next.next;
  }
 
  /**
   * 通过下标获取结点
   * @param index 下标
   * @return 结点
   */
  public Node getByIndex(Integer index) {
  if (index < 0 || index > length() - 1) {
    System.out.println("不存在此下标结点");
  }
  Node temp = head;
  int i = 0;
  while (temp != null) {
    if (i == index) {
    return temp;
    }
    i ++;
    temp = temp.next;
  }
  return null;
  }
 
  /**
   * 打印链表值
   */
  public void printLink() {
  Node temp = head;
  while (temp != null) {
    System.out.println(temp.value);
    temp = temp.next;
  }
  }
 
  /**
   * 打印某个节点之后的所有值
   * @param node
   */
  public static void printAfterNode(Node node) {
  while (node != null) {
    System.out.println(node.value);
    node = node.next;
  }
  }
 
  /**
   * 清除单链表
   */
  public void clearLink() {
  head = null;
  }
 
  /**
   * 单链表反转
   * @param head 头节点
   */
  public Node reverseLink(Node head) {
  Node prev = null;
  Node curr = head;
  while (curr != null) {
    Node nextTemp = curr.next;
    curr.next = prev;
    prev = curr;
    curr = nextTemp;
  }
  return prev;
  }
 
  /**
   * 测试
   * @param args
   */
  public static void main(String[] args) {
  SingleLinkedList linkNode = new SingleLinkedList();
  linkNode.addHead(2);
  linkNode.addHead(3);
  linkNode.addHead(5);
  linkNode.addLast(9);
  linkNode.addLast(7);
  System.out.println("打印单链表: ");
  linkNode.printLink();
  Node byIndex1 = linkNode.getByIndex(0);
  System.out.println("获取下标为1的结点值: " + byIndex1.value);
  linkNode.addByIndex(2, 8);
  System.out.println("下标2添加后打印单链表: ");
  linkNode.printLink();
  linkNode.addByIndex(0, 11);
  System.out.println("下标0添加后打印单链表: ");
  linkNode.printLink();
  linkNode.deleteByIndex(0);
  System.out.println("下标0删除后打印单链表: ");
  linkNode.printLink();
  Node node = linkNode.reverseLink(linkNode.head);
  System.out.println("反转后打印单链表: ");
  printAfterNode(node);
  }
 
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/pavel101/article/details/114004379

关注下面的标签,发现更多相似文章