单链表

insertFirst:在表头插入一个新的链接点,时间复杂度为O(1)

deleteFirst:删除表头的链接点,时间复杂度为O(1)

有了这两个方法,就可以用单链表来实现一个栈了,见http://blog.csdn.net/a19881029/article/details/22579759

find:查找包含指定关键字的链接点,由于需要遍历查找,平均需要查找N/2次,即O(N)

remove:删除包含指定关键字的链接点,由于需要遍历查找,平均需要查找N/2次,即O(N)

  1. public class LinkedList {
  2. private class Data{
  3. private Object obj;
  4. private Data next = null;
  5. Data(Object obj){
  6. this.obj = obj;
  7. }
  8. }
  9. private Data first = null;
  10. public void insertFirst(Object obj){
  11. Data data = new Data(obj);
  12. data.next = first;
  13. first = data;
  14. }
  15. public Object deleteFirst() throws Exception{
  16. if(first == null)
  17. throw new Exception("empty!");
  18. Data temp = first;
  19. first = first.next;
  20. return temp.obj;
  21. }
  22. public Object find(Object obj) throws Exception{
  23. if(first == null)
  24. throw new Exception("LinkedList is empty!");
  25. Data cur = first;
  26. while(cur != null){
  27. if(cur.obj.equals(obj)){
  28. return cur.obj;
  29. }
  30. cur = cur.next;
  31. }
  32. return null;
  33. }
  34. public void remove(Object obj) throws Exception{
  35. if(first == null)
  36. throw new Exception("LinkedList is empty!");
  37. if(first.obj.equals(obj)){
  38. first = first.next;
  39. }else{
  40. Data pre = first;
  41. Data cur = first.next;
  42. while(cur != null){
  43. if(cur.obj.equals(obj)){
  44. pre.next = cur.next;
  45. }
  46. pre = cur;
  47. cur = cur.next;
  48. }
  49. }
  50. }
  51. public boolean isEmpty(){
  52. return (first == null);
  53. }
  54. public void display(){
  55. if(first == null)
  56. System.out.println("empty");
  57. Data cur = first;
  58. while(cur != null){
  59. System.out.print(cur.obj.toString() + " -> ");
  60. cur = cur.next;
  61. }
  62. System.out.print("\n");
  63. }
  64. public static void main(String[] args) throws Exception {
  65. LinkedList ll = new LinkedList();
  66. ll.insertFirst(4);
  67. ll.insertFirst(3);
  68. ll.insertFirst(2);
  69. ll.insertFirst(1);
  70. ll.display();
  71. ll.deleteFirst();
  72. ll.display();
  73. ll.remove(3);
  74. ll.display();
  75. System.out.println(ll.find(1));
  76. System.out.println(ll.find(4));
  77. }
  78. }
  1. 1 -> 2 -> 3 -> 4 ->
  2. 2 -> 3 -> 4 ->
  3. 2 -> 4 ->
  4. null
  5. 4

双端链表(不是双向链表):

与单向链表的不同之处在保存有对最后一个链接点的引用(last)

insertFirst:在表头插入一个新的链接点,时间复杂度O(1)

insertLast:在表尾插入一个新的链接点,时间复杂度O(1)

deleteFirst:删除表头的链接点,时间复杂度O(1)

deleteLast::删除表尾的链接点,由于只保存了表尾的链接点,而没有保存表尾的前一个链接点(这里就体现出双向链表的优势了),所以在删除表尾链接点时需要遍历以找到表尾链接点的前一个链接点,需查找N-1次,也就是O(N)

有了这几个方法就可以用双端链表来实现一个队列了,http://blog.csdn.net/a19881029/article/details/22654121

  1. public class FirstLastList {
  2. private class Data{
  3. private Object obj;
  4. private Data next = null;
  5. Data(Object obj){
  6. this.obj = obj;
  7. }
  8. }
  9. private Data first = null;
  10. private Data last = null;
  11. public void insertFirst(Object obj){
  12. Data data = new Data(obj);
  13. if(first == null)
  14. last = data;
  15. data.next = first;
  16. first = data;
  17. }
  18. public void insertLast(Object obj){
  19. Data data = new Data(obj);
  20. if(first == null){
  21. first = data;
  22. }else{
  23. last.next = data;
  24. }
  25. last = data;
  26. }
  27. public Object deleteFirst() throws Exception{
  28. if(first == null)
  29. throw new Exception("empty");
  30. Data temp = first;
  31. if(first.next == null)
  32. last = null;
  33. first = first.next;
  34. return temp.obj;
  35. }
  36. public void deleteLast() throws Exception{
  37. if(first == null)
  38. throw new Exception("empty");
  39. if(first.next == null){
  40. first = null;
  41. last = null;
  42. }else{
  43. Data temp = first;
  44. while(temp.next != null){
  45. if(temp.next == last){
  46. last = temp;
  47. last.next = null;
  48. break;
  49. }
  50. temp = temp.next;
  51. }
  52. }
  53. }
  54. public void display(){
  55. if(first == null)
  56. System.out.println("empty");
  57. Data cur = first;
  58. while(cur != null){
  59. System.out.print(cur.obj.toString() + " -> ");
  60. cur = cur.next;
  61. }
  62. System.out.print("\n");
  63. }
  64. public static void main(String[] args) throws Exception {
  65. FirstLastList fll = new FirstLastList();
  66. fll.insertFirst(2);
  67. fll.insertFirst(1);
  68. fll.display();
  69. fll.insertLast(3);
  70. fll.display();
  71. fll.deleteFirst();
  72. fll.display();
  73. fll.deleteLast();
  74. fll.display();
  75. }
  76. }
  1. 1 -> 2 ->
  2. 1 -> 2 -> 3 ->
  3. 2 -> 3 ->
  4. 2 ->

有序链表:链表中的数据按从小到大排列

  1. public class SortedList {
  2. private class Data{
  3. private Object obj;
  4. private Data next = null;
  5. Data(Object obj){
  6. this.obj = obj;
  7. }
  8. }
  9. private Data first = null;
  10. public void insert(Object obj){
  11. Data data = new Data(obj);
  12. Data pre = null;
  13. Data cur = first;
  14. while(cur != null && (Integer.valueOf(data.obj.toString())
  15. .intValue() > Integer.valueOf(cur.obj.toString())
  16. .intValue())){
  17. pre = cur;
  18. cur = cur.next;
  19. }
  20. if(pre == null)
  21. first = data;
  22. else
  23. pre.next = data;
  24. data.next = cur;
  25. }
  26. public Object deleteFirst() throws Exception{
  27. if(first == null)
  28. throw new Exception("empty!");
  29. Data temp = first;
  30. first = first.next;
  31. return temp.obj;
  32. }
  33. public void display(){
  34. if(first == null)
  35. System.out.println("empty");
  36. System.out.print("first -> last : ");
  37. Data cur = first;
  38. while(cur != null){
  39. System.out.print(cur.obj.toString() + " -> ");
  40. cur = cur.next;
  41. }
  42. System.out.print("\n");
  43. }
  44. public static void main(String[] args) throws Exception{
  45. SortedList sl = new SortedList();
  46. sl.insert(80);
  47. sl.insert(2);
  48. sl.insert(100);
  49. sl.display();
  50. System.out.println(sl.deleteFirst());
  51. sl.insert(33);
  52. sl.display();
  53. sl.insert(99);
  54. sl.display();
  55. }
  56. }
  1. first -> last : 2 -> 80 -> 100 ->
  2. 2
  3. first -> last : 33 -> 80 -> 100 ->
  4. first -> last : 33 -> 80 -> 99 -> 100 ->

表的插入和删除平均需要比较N/2次,即O(N),但是获取最小数据项只需O(1),因为其始终处于表头,对频繁操作最小数据项的应用,可以考虑使用有序链表实现,如:优先级队列

和数组相比,链表的优势在于长度不受限制,并且在进行插入和删除操作时,不需要移动数据项,故尽管某些操作的时间复杂度与数组想同,实际效率上还是比数组要高很多

劣势在于随机访问,无法像数组那样直接通过下标找到特定的数据项

Java单链表、双端链表、有序链表实现的更多相关文章

  1. Java数据结构——用双端链表实现队列

    //================================================= // File Name : LinkQueue_demo //---------------- ...

  2. java数据结构-09双端队列

    一.相关概念: (Deque)双端队列能够在队头.队尾进行添加.删除等操作  二.接口设计:  三.代码实现 public class Deque<E> { private List< ...

  3. C++单链表反转、两有序链表合并仍有序

    1 #include<iostream> 2 3 struct Node 4 { 5 int data; 6 Node *next; 7 }; 8 9 typedef struct Nod ...

  4. java数据结构——单链表、双端链表、双向链表(Linked List)

    1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...

  5. JAVA基础——链表结构之双端链表

    双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用 如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双 ...

  6. Java实现 LeetCode 21 合并两个有序链表

    21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...

  7. c# 有序链表合并 链表反转

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  9. 代码题(14)— 合并有序链表、数组、合并K个排序链表

    1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  10. leecode刷题(23)-- 合并两个有序链表

    leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2-> ...

随机推荐

  1. Daily Scrum – 1/19

    Meeting Minutes 绑定了快捷键: 改良了user course: 修了一系列Bug: 准备进行演示 Progress   part 组员 今日工作 Time (h) 明日计划 Time ...

  2. android学习——error opening trace file: No such file or directory (2)

    1.疑惑: 程序运行起来的时候日志总是显示下面这个错误,但是不影响程序的正常进行,我是用真机来测试的,android4.4.4(API17). 02-11 14:55:03.629 15525-155 ...

  3. 在Eclipse 中下载 开源中国码云上的项目

    功能:使用开源中国代码托管(码云)来托管代码,本地的使用Eclipse,该如何配置? 步骤: 1/  在码云 上建一个工程,(为了访问托管工程的权限) 2/  在eclipse中打开名字叫做“Git ...

  4. jQuery Select的操作集合

    1. $("#select_id").change(function(){... });   //为select添加事件,当选择其中一项时触发2. $("#select_ ...

  5. github 建立博客

    Last login: Wed Jan 27 20:33:21 on console liukun-MBP:~ kamil$ cd ~/.ssh/ liukun-MBP:.ssh kamil$ ls ...

  6. SVN 服务器端安装过程

    1.安装软件版本: VisualSVN-Server-2.1.5.msi 右击安装软件,单机“安装” 2.单击[Next] 选择“I accept the terms in the License A ...

  7. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理

    准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...

  8. chroot详解

    我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...

  9. 了解 Nginx 基本概念

    前言 本篇是我学习 Nginx 的一些笔记,主要内容讲述了一些了解 Nginx 需要的基本概念.然后探讨一下 Nginx 的模块化的组织架构,以及各个模块的分类.工作方式.职责和提供的相关指令. 主要 ...

  10. iOS应用支持IPV6

    一.IPV6-Only支持是啥? 首先IPV6,是对IPV4地址空间的扩充.目前当我们用iOS设备连接上Wifi.4G.3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IP ...