【算法数据结构Java实现】Java实现单链表
1.背景
单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象。需要两个参数定位:一个是index,表示对象的方位。另一个是node的对象。
2.代码
public class Node {protected Node next;protected int data;public Node(int data){this.data=data;}public void display(){System.out.print(data+"");}
}
arraylist类
public class myArrayList {public Node first;//定义头结点private int pos=0;//节点位置public myArrayList(){// this.first=null;}//插入一个头结点public void addFirstNode(int data){Node node=new Node(data);node.next=first;first=node;}//删除头结点public Node deleteFirstNode(){Node tempNode=first;first=tempNode.next;return tempNode;}// 在任意位置插入节点 在index的后面插入 public void add(int index, int data) { Node node = new Node(data); Node current = first; Node previous = first; while ( pos != index) { previous = current; current = current. next; pos++; } node. next = current; previous. next = node; pos = 0; } // 删除任意位置的节点 public Node deleteByPos( int index) { Node current = first; Node previous = first; while ( pos != index) { pos++; previous = current; current = current. next; } if(current == first) { first = first. next; } else { pos = 0; previous. next = current. next; } return current; } public void displayAllNodes() { Node current = first; while (current != null) { current.display();System.out.println();current = current. next; } } }
实现的main函数:
public class Main {public static void main(String args[]){myArrayList ls=new myArrayList(); ls.addFirstNode(15); ls.addFirstNode(16);ls.add(1, 144);ls.add(2, 44);ls.deleteByPos(1);ls.displayAllNodes(); }
}
16
44
15
package LinkedList; /** * <p><strong>我的Java单链表练习</strong></p> * <p>单链表提供了在列表头的高效插入和删除操作,不过在单链表的末尾的插入操作效率很低.</p> * <p>单链表指针域保存着下一节点的引用,尾结点的指针域等于null</p> * @author baby69yy2000 */
public class SingleLinkedList<T> { /** * 结点类 */ private static class Node<T> { T nodeValue; // 数据域 Node<T> next; // 指针域保存着下一节点的引用 Node(T nodeValue, Node<T> next) { this.nodeValue = nodeValue; this.next = next; } Node(T nodeValue) { this(nodeValue, null); } } // 下面是SingleLinkedList类的数据成员和方法 private Node<T> head, tail; public SingleLinkedList() { head = tail = null; } /** * 判断链表是否为空 */ public boolean isEmpty() { return head == null; } /** * 创建头指针,该方法只用一次! */ public void addToHead(T item) { head = new Node<T>(item); if(tail == null) tail = head; } /** * 添加尾指针,该方法使用多次 */ public void addToTail(T item) { if (!isEmpty()) { // 若链表非空那么将尾指针的next初使化为一个新的元素 tail.next = new Node<T>(item); // 然后将尾指针指向现在它自己的下一个元素 tail = tail.next; } else { // 如果为空则创建一个新的!并将头尾同时指向它 head = tail = new Node<T>(item); } } /** * 打印列表 */ public void printList() { if (isEmpty()) { System.out.println("null"); } else { for(Node<T> p = head; p != null; p = p.next) System.out.println(p.nodeValue); } } /** * 在表头插入结点,效率非常高 */ public void addFirst(T item) { Node<T> newNode = new Node<T>(item); newNode.next = head; head = newNode; } /** * 在表尾插入结点,效率很低 */ public void addLast(T item) { Node<T> newNode = new Node<T>(item); Node<T> p = head; while (p.next != null) p = p.next; p.next = newNode; newNode.next = null; } /** * 在表头删除结点,效率非常高 */ public void removeFirst() { if (!isEmpty()) head = head.next; else System.out.println("The list have been emptied!"); } /** * 在表尾删除结点,效率很低 */ public void removeLast() { Node<T> prev = null, curr = head; while(curr.next != null) { prev = curr; curr = curr.next; if(curr.next == null) prev.next = null; } } /** * <p>插入一个新结点</p> * <ul>插入操作可能有四种情况: * <li>①表为空, 返回false</li> * <li>②表非空,指定的数据不存在</li> * <li>③指定的数据是表的第一个元素</li> * <li>④指定的数据在表的中间</li></ul> * @param appointedItem 指定的nodeValue * @param item 要插入的结点 * @return 成功插入返回true; */ public boolean insert(T appointedItem, T item) { Node<T> prev = head, curr = head.next, newNode; newNode = new Node<T>(item); if(!isEmpty()) { while((curr != null) && (!appointedItem.equals(curr.nodeValue))) { //两个判断条件不能换 prev = curr; curr = curr.next; } newNode.next = curr; //②③④ prev.next = newNode; return true; } return false; //① } /** * <p>移除此列表中首次出现的指定元素</p> * <ul>删除操作可能出现的情况: * <li>①prev为空,这意味着curr为head. head = curr.next; --> removeFirst();</li> * <li>②匹配出现在列表中的某个中间位置,此时执行的操作是 --> prev.next = curr.next;,</li></ul> * <p>在列表中定位某个结点需要两个引用:一个对前一结点(prev左)的引用以及一个对当前结点(curr右)的引用.</p> * prev = curr; * curr = curr.next; */ public void remove(T item) { Node<T> curr = head, prev = null; boolean found = false; while (curr != null && !found) { if (item.equals(curr.nodeValue)) { if(prev == null) removeFirst(); else prev.next = curr.next; found = true; } else { prev = curr; curr = curr.next; } } } /** * 返回此列表中首次出现的指定元素的索引,如果列表中不包含此元素,则返回 -1. */ public int indexOf(T item) { int index = 0; Node<T> p; for(p = head; p != null; p = p.next) { if(item.equals(p.nodeValue)) return index; index++; } return -1; } /** * 如果此列表包含指定元素,则返回 true。 */ public boolean contains(T item) { return indexOf(item) != -1; } public static void main(String[] args) { SingleLinkedList<String> t = new SingleLinkedList<String>(); t.addToHead("A"); //t.addFirst("addFirst"); t.addToTail("B"); t.addToTail("C"); System.out.println(t.indexOf("C")); // 2 System.out.println(t.contains("A")); // true //t.addLast("addLast"); //t.removeLast(); //t.insert("B", "insert"); //t.removeFirst(); //t.remove("B"); // A C t.printList(); // A B C } }
/********************************
* 本文来自博客 “李博Garvin“
* 转载请标明出处:http://blog.csdn.net/buptgshengod
******************************************/
【算法数据结构Java实现】Java实现单链表相关推荐
- java带头结点空单链表_Java版带头结点单链表的实现
Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...
- 数据结构例16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序。
/* 16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序. */ # include <iostream> # include <stdlib.h> # i ...
- 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)
数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...
- java 栈_Java实现单链表、栈、队列三种数据结构
作者:远航 cnblogs.com/yang-guang-zhang/p/13884023.html 一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据 ...
- java带头结点的单链表_自己实现集合框架 (五): 带头结点单链表的实现
这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...
- java不带头结点单链表,java带头结点的单链表
JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...
- java带头节点的单链表_自己实现集合框架(五):带头结点单链表的实现
这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...
- 数据结构实验报告——排序算法设计及分析(排序单链表)
一.实验目的和要求 通过学习多种排序算法,体会对同一种操作多种不同的算法设计:通过比较各排序算法对于数据存储结构的要求,体会算法设计不依赖于数据存储结构,而算法实现依赖于数据存储结构:通过分析排序算法 ...
- java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目
packageLinkedListSummary; importjava.util.HashMap; importjava.util.Stack; /** * http://blog.csdn.net ...
- java 判断两个单链表是否相交
文章目录 题目 思考 源码 环的入口 题目 单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回 ...
最新文章
- web前端技巧-文本如何垂直居中?多行文本如何实现上下居中?
- 为MongoDB定制Spring Social Connect框架
- Ubuntu如何安装setuptools
- 35 MM配置-采购-采购订单-设置价格差异的容差限制
- UIButton设置UIControlContentHorizontalAlignment调整文字对齐方式
- mac电池损耗百分比怎么查看
- FISCO BCOS Solidity 智能合约Compiler error:Stack too deep, try removing local variables 如何传递超过16个参数变量
- 拉取 google.golang.org/grpc 报错
- PR转场预设 放大特效带有重影效果的PR视频转场预设
- 微信小程序picker选择器(下拉框)以及传值问题
- kmplayer android官方下载,KMPlayer下载
- 计算机word论文,怎么用电脑Word写论文?
- Web前端工程师学习路径图,你掌握了多少?
- JSON Parse error:Unrecognized token xxx
- SQLMAP进阶:参数讲解
- 在 Linux 上以 All-in-One 模式安装 KubeSphere
- 关于数据挖掘中“多重共线性”的确定方法(有图有真相)
- OLED_I2C_3D_Cube
- LyScript 插件实现UPX脱壳
- 为灾区祈福 Flash制作地震视觉效果
热门文章
- 李永乐线性代数手写笔记-行列式与矩阵
- java流方式接收pdf_java – 在Itext 7中,如何获取范围流来签署pdf?
- python程序语法元素分析_Python程序语法元素分析(2)
- angular ajax get post 参数,AngularJS - $ http.post发送请求参数而不是JSON的任何方式?...
- pandas to_json转换时强制中文而不是unicode
- matplotlib 制作不等间距直方图
- I.MX6ULL镜像文件
- php td内容换行,table单元格内容过多换行显示
- win10 管理linux文件,Linux子系统文件可在未来的Win10发行版中通过资源管理器访问...
- oracle中over 语法,Oracle语法之OVER(PARTITIONBY..)及开窗函数