1.背景

单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象。需要两个参数定位:一个是index,表示对象的方位。另一个是node的对象。

2.代码

node类
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   }   }
参考:http://blog.csdn.net/tayanxunhua/article/details/11100097

/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/

【算法数据结构Java实现】Java实现单链表相关推荐

  1. java带头结点空单链表_Java版带头结点单链表的实现

    Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...

  2. 数据结构例16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序。

    /* 16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序. */ # include <iostream> # include <stdlib.h> # i ...

  3. 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)

    数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...

  4. java 栈_Java实现单链表、栈、队列三种数据结构

    作者:远航 cnblogs.com/yang-guang-zhang/p/13884023.html 一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据 ...

  5. java带头结点的单链表_自己实现集合框架 (五): 带头结点单链表的实现

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  6. java不带头结点单链表,java带头结点的单链表

    JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...

  7. java带头节点的单链表_自己实现集合框架(五):带头结点单链表的实现

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  8. 数据结构实验报告——排序算法设计及分析(排序单链表)

    一.实验目的和要求 通过学习多种排序算法,体会对同一种操作多种不同的算法设计:通过比较各排序算法对于数据存储结构的要求,体会算法设计不依赖于数据存储结构,而算法实现依赖于数据存储结构:通过分析排序算法 ...

  9. java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目

    packageLinkedListSummary; importjava.util.HashMap; importjava.util.Stack; /** * http://blog.csdn.net ...

  10. java 判断两个单链表是否相交

    文章目录 题目 思考 源码 环的入口 题目 单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回 ...

最新文章

  1. web前端技巧-文本如何垂直居中?多行文本如何实现上下居中?
  2. 为MongoDB定制Spring Social Connect框架
  3. Ubuntu如何安装setuptools
  4. 35 MM配置-采购-采购订单-设置价格差异的容差限制
  5. UIButton设置UIControlContentHorizontalAlignment调整文字对齐方式
  6. mac电池损耗百分比怎么查看
  7. FISCO BCOS Solidity 智能合约Compiler error:Stack too deep, try removing local variables 如何传递超过16个参数变量
  8. 拉取 google.golang.org/grpc 报错
  9. PR转场预设 放大特效带有重影效果的PR视频转场预设
  10. 微信小程序picker选择器(下拉框)以及传值问题
  11. kmplayer android官方下载,KMPlayer下载
  12. 计算机word论文,怎么用电脑Word写论文?
  13. Web前端工程师学习路径图,你掌握了多少?
  14. JSON Parse error:Unrecognized token xxx
  15. SQLMAP进阶:参数讲解
  16. 在 Linux 上以 All-in-One 模式安装 KubeSphere
  17. 关于数据挖掘中“多重共线性”的确定方法(有图有真相)
  18. OLED_I2C_3D_Cube
  19. LyScript 插件实现UPX脱壳
  20. 为灾区祈福 Flash制作地震视觉效果

热门文章

  1. 李永乐线性代数手写笔记-行列式与矩阵
  2. java流方式接收pdf_java – 在Itext 7中,如何获取范围流来签署pdf?
  3. python程序语法元素分析_Python程序语法元素分析(2)
  4. angular ajax get post 参数,AngularJS - $ http.post发送请求参数而不是JSON的任何方式?...
  5. pandas to_json转换时强制中文而不是unicode
  6. matplotlib 制作不等间距直方图
  7. I.MX6ULL镜像文件
  8. php td内容换行,table单元格内容过多换行显示
  9. win10 管理linux文件,Linux子系统文件可在未来的Win10发行版中通过资源管理器访问...
  10. oracle中over 语法,Oracle语法之OVER(PARTITIONBY..)及开窗函数