java模拟实现单向链表

直接上代码

  1 package com.bjpowernode.test.datastructure;
  2
  3 public class Mylinked {
  4
  5       Node first;//头结点
  6
  7       int size;//链表的长度
  8
  9     public void add(Object value) {
 10         Node newNode = new Node(value);
 11         if (first == null) {
 12             first = newNode;
 13         } else {
 14             Node tmp = first;//当前节点
 15             while(tmp.getNext() != null) {
 16                 tmp = tmp.getNext();
 17             }
 18             //设置最后一个元素的下一个引用
 19             tmp.setNext(newNode);
 20         }
 21         size++;
 22     }
 23
 24     public void add(Object value,int index) {
 25         Node newNode = new Node(value);
 26         if (index > size - 1) {
 27             //插入链表最后的元素
 28             add(value);
 29         } else {
 30             //在已有的元素之间插入
 31             Node oldnode = first;//头节点,从头结点开始遍历,得到目标位置的元素,后面需要把新节点的next指向它
 32             Node pre = first;//目标节点的上一节点
 33             for (int i = 0; i < index; i++) {
 34                 if (i == index - 1) {
 35                     pre = oldnode;
 36                 }
 37                 oldnode = oldnode.getNext();
 38             }
 39             //需要把上一个节点的next引用指向自己,自己的下一引用指向下一节点
 40             pre.setNext(newNode);
 41             newNode.setNext(oldnode);
 42             size++;
 43         }
 44     }
 45     public Object get(int index) {
 46         Node tmp = first;//当前节点
 47         for (int i = 0; i < index; i++) {
 48             tmp = tmp.getNext();
 49         }
 50         return tmp.getValue();
 51     }
 52     public void remove(int index) {
 53         if (index > size - 1) {
 54             //没有节点
 55             return;
 56         }
 57         if (index == 0) {
 58             //删除头元素
 59             first = first.getNext();
 60         } else {
 61             //找到删除元素的头一个元素
 62             Node tmp = first;//当前节点
 63             for (int i = 0; i < index - 1; i++) {
 64                 tmp = tmp.getNext();
 65             }
 66             tmp.setNext(tmp.getNext().getNext());
 67             size--;
 68         }
 69     }
 70     public void remove(Object obj) {
 71         if (size > 0) {
 72             Node tmp = first;
 73             int k = 0;//表示循环了几次才找到目标对象
 74             while (!tmp.getValue().equals(obj)) {
 75                 tmp = tmp.getNext();
 76                 k++;
 77             }
 78             if (size == 1) {
 79                 tmp = null;
 80             } else {
 81                 Node node = tmp.getNext();
 82                 //需要找到tmp的上一个节点
 83                 Node preNode = first;
 84                 for (int i = 1; i < k; i++) {
 85                     preNode = preNode.getNext();
 86                 }
 87                 preNode.setNext(node);
 88             }
 89             size--;
 90         }
 91
 92     }
 93     class Node {
 94
 95         private Node next;//下一节点的引用
 96
 97         private Object value;//结点值
 98
 99         public void setNext(Node next) {
100             this.next = next;
101         }
102
103         public void setValue(Object value) {
104             this.value = value;
105         }
106         public Node(Object value) {
107             this.value = value;
108         }
109
110         public Node getNext() {
111             return next;
112         }
113
114         public Object getValue() {
115             return value;
116         }
117     }
118
119     int length() {
120         return size;
121     }
122 }
123 class Main {
124
125     public static void main(String[] args) throws Exception {
126         Mylinked mylinked = new Mylinked();
127         mylinked.add("a");
128         mylinked.add("b");
129         mylinked.add("c");
130         mylinked.add("d");
131         mylinked.add("e");
132
133         System.out.println(mylinked.get(0));
134         System.out.println(mylinked.get(1));
135         System.out.println(mylinked.get(2));
136         System.out.println(mylinked.get(3));
137         System.out.println(mylinked.get(4));
138         mylinked.add("f", 2);
139         //  mylinked.remove(5);
140         mylinked.remove("e");
141
142
143     }
144 }

原文地址:https://www.cnblogs.com/hkdpp/p/11813982.html

时间: 2024-10-09 23:53:03

java模拟实现单向链表的相关文章

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

java版的单向链表的基本操作

首先定义链表节点的结构: package com.moluo.linklist; /** * * @author 行者摩罗 * */ public class Node { private int data; private Node next; public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next;

I学霸官方免费教程三十七:Java数据结构之单向链表结构

数据结构之单向链表 例如:现有双向链表OneWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A.B.C.D,由上述结构可以知道,节点A中存储着元素1和节点B:节点B中存储着元素2和节点C,节点C中存储着元素3和节点D,节点D中存储着元素4和null.如果现在要在元素2和3中间插入一个元素5:过程如下:1.创建节点E,E中存储元素52.将B中的下一个节点修改为节点E3.将E中的下一个节点赋值为节点C从上述过程看,插入时没有节点位置移动的操作,所以效率比较高:删除的过程和

使用java的循环单向链表解决约瑟夫问题

什么是约瑟夫问题 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过k-1个人,并杀掉第k个人.这

自己用20分钟java实现的单向链表(含有增删改查操作)

package test1; // 建立一个链表结构 public class SingleList { //定义头结点指针 Node head = null; //定义链表的节点数据结构 class Node{ int val; Node next; public Node(int val){ this.val = val; next = null; } } //在链表的尾部增加一个节点 public void add(int num){ Node node = new Node(num);

Java 模拟双端链表

双端链表: 双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用rear 这样在链尾插入会变得非常容易,只需改变rear的next为新增的结点即可,而不需要循环搜索到最后一个节点 所以有insertFirst.insertLast 删除链头时,只需要改变引用指向即可:删除链尾时,需要将倒数第二个结点的next置空, 而没有一个引用是指向它的,所以还是需要循环来读取操作 /** * 双端链表 * @author stone */ public class TwoEndpoint

模拟创建单向链表

节点类:public class ListNode {int data;//数据ListNode next;//指针ListNode(int x){data=x;}public int getData() {return data;}public void setData(int data) {this.data = data;}public ListNode getNext() {return next;}public void setNext(ListNode next) {this.nex

单向链表模拟

为什么出这个真理文档呢?方面以后我们的视频不断跟进,高级部分关于JDK源码的学习,所以有些基本的思维要叙述一下,包括AQS,常用数据结构,线程等等.这一个帖子主要是我以前写的模拟常用数据结构的代码,可能有些bug 并且不规范,但是重在学习思维.并没有JDK源码部分考虑多,只是简单的写了一点.分享给大家,关于线程同步器的学习我觉得先会用  然后看源码,接着模拟.好开始数据结构了. 注意:在java数据结构中模拟的话 通过数组和引用可以模拟几乎所有的结构. 链表结构的模拟 1.单向链表 a.基础结构

线性表的Java实现--链式存储(单向链表)

线性表的Java实现--链式存储(单向链表) 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在插入.删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢. 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理.但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空