软件编程
位置:首页>> 软件编程>> java编程>> java实现简单单链表

java实现简单单链表

作者:xinan~  发布时间:2023-10-30 09:45:46 

标签:java,单链表

本文实例为大家分享了java实现简单单链表的具体代码,供大家参考,具体内容如下

一、定义:

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(相当于JAVA中的引用,指示后继元素存储位置,),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

二、结构:

java实现简单单链表

如图所示,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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com