单向链表

Posted on

单向链表

单向链表**

博客分类:

【链表】 是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多, 但是查找一个节点或者访问特定编号的节点则需要O(n)的时间, 而顺序表相应的时间复杂度分别是O(㏒ n)和O(1)。 【单向链表】 是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始 一个节点包含两个域,一个信息域和一个指针域,指针域指向下一个节点,最后一个节点指向一个空值 单向链表有一个头节点,可以不存储任何信息,包含一个指向第一个节点的指针 特点: 1.访问节点速度慢,需要从头节点一次遍历链表 2.更新节点快,节点不需要移动,更改相应指针即可

单向链表节点类定义如下:

Java代码 收藏代码

  1. public class Node{
  2. AnyType element;
  3. Node next;
  4. }

要实现单向列表的相关操作,可定义类SingleLinkedList如下: Java代码 收藏代码

  1. public class SingleLinkedList{
  2. private static class Node{
  3. AnyType element;
  4. Node next;
  5. public Node(AnyType element){
  6. this.element = element;
  7. }
  8. }
  9. private Node header = new Node(null);
  10. private int size = 0;
  11. public boolean isEmpty(){
  12. return size==0;
  13. }
  14. public void makeEmpty(){
  15. header = null;
  16. }
  17. public int size(){
  18. return size;
  19. }
  20. ///
  21. /* Get element by index
  22. / //
  23. public AnyType get(int index){
  24. return getNode(index).element;
  25. }
  26. ///
  27. /* Add the element to the end of this list
  28. / //
  29. public void add(AnyType element){
  30. add(new Node(element));
  31. }
  32. ///
  33. /* Inserts the specified element at the specified position in this list
  34. /* 插入逻辑:
  35. /* 1.创建一个新节点
  36. /* 2.将原index节点的前一个节点的指针指向新节点
  37. /* 3.将新节点的指针指向index节点
  38. /* 4.插入后,新节点的位置为index
  39. / //
  40. public void add(int index,AnyType element){
  41. Node newNode = new Node(element);
  42. Node previous = getNode(index-1);
  43. //index节点
  44. Node node = previous.next;
  45. //将原index节点的前一个节点的指针指向newNode
  46. previous.next = newNode;
  47. //将newNode的指针指向index节点
  48. newNode.next = node;
  49. size++;
  50. }
  51. ///
  52. /* Inserts the specified element at the specified position in this list
  53. /* 删除逻辑:
  54. /* 1.获得index节点的前一个节点previousNode
  55. /* 2.获得index节点的后一个节点nextNode
  56. /* 3.将previousNode的指针指向nextNode
  57. / //
  58. public void remove(int index){
  59. Node previous = getNode(index-1);
  60. Node next = previous.next.next;
  61. previous.next = next;
  62. size--;
  63. }
  64. ///
  65. /* 定义此方法是为了便于测试
  66. / //
  67. public List getElements(){
  68. if(isEmpty()){
  69. return null;
  70. }else{
  71. List elements = new ArrayList();
  72. Node node = (Node) header;
  73. while(node.next!=null){
  74. node = node.next;
  75. elements.add(((Element)node.element).getValue());
  76. }
  77. return elements;
  78. }
  79. }
  80. //private methods
  81. private Node getNode(int index){
  82. if(isEmpty()){
  83. throw new RuntimeException("List is empty");
  84. }
  85. int i = 0;
  86. Node node = header;
  87. while(i<=index){
  88. node = node.next;
  89. i++;
  90. }
  91. return node;
  92. }
  93. private void add(Node newNode){
  94. Node node = header;
  95. while(node.next!=null){
  96. node = node.next;
  97. }
  98. node.next = newNode;
  99. size++;
  100. }
  101. }

如何实现链表反向: Java代码 收藏代码

  1. ///
  2. /* 链表反向
  3. / //
  4. public void reverse(){
  5. if(!isEmpty()){
  6. reverse(header.next,header.next.next);
  7. }
  8. }

Java代码 收藏代码

  1. private void reverse(Node node,Node nextNode){
  2. if(nextNode.next!=null){
  3. reverse(nextNode,nextNode.next);
  4. }else{
  5. //如果该节点是表尾,那么用头节点指向此节点
  6. header.next = nextNode;
  7. }
  8. //该节点的指针指向前一个节点P,并将节点P的指针设置为空
  9. nextNode.next = node;
  10. node.next = null;
  11. }

来源: [http://tangyanbo.iteye.com/blog/1472811](http://tangyanbo.iteye.com/blog/1472811)

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途
本文链接: 单向链表