【数据结构】JavaScript实现单链表、单链表反转

待我称王封你为后i 2022-05-16 02:23 336阅读 0赞

链表

链接也是一种存储数据的工具,不同于数组,链表中的元素并不是连续存储的。因此不能通过下标去访问。 链表分为单(向)链表,双向链表,循环链表等。.今天来实现一下单链表。
单链表中的每个元素包括两个两个域,一个是保存元素本身的域,另一个是指向一下一个节点的指针域

  1. function LinkedList(){
  2. var Node = function( ele ){
  3. this.ele = ele; //ele 属性代表插入的值
  4. this.next = null; // next属性 代表 指向下一个节点的指针
  5. }
  6. var head = null;
  7. var length = 0;
  8. // 向链表末尾插入一个元素
  9. this.append = function(ele){
  10. var node = new Node(ele);
  11. var currentNode = null;
  12. if( head === null){ // 列表为空,插入的节点是第一个头结点
  13. head = node;
  14. }
  15. else{
  16. currentNode = head;
  17. // 循环链表,直到最后一个节点
  18. while( currentNode.next !== null ){
  19. currentNode = currentNode.next;
  20. }
  21. // 出了while循环,说明找到了最后一个节点
  22. currentNode.next = node;
  23. }
  24. length++;
  25. }
  26. // 删除链表中指定的某个节点:删除头结点 or 除了头结点以外的节点
  27. this.removeAt = function( position ){
  28. var currentNode = head;
  29. var previousNode = null;
  30. var index = 0;
  31. if( position >= 0 && position < length ){
  32. if( position === 0 ){
  33. node = currentNode.next;
  34. }
  35. else{
  36. while( index++ < position ){
  37. previousNode = currentNode;
  38. currentNode = currentNode.next;
  39. }
  40. // 出了while循环, index === position
  41. previousNode.next = currentNode.next;
  42. }
  43. length--;
  44. return currentNode.ele
  45. }
  46. // 要删除的节点的不存在
  47. else{
  48. return -1;
  49. }
  50. }
  51. // 在任意位置插入一个元素
  52. this.insert = function(){
  53. // 检查是否越界
  54. if( position >= 0 && position <= length ){
  55. var newNode = new Node(ele);
  56. var currentNode = head; // 保存一下头结点
  57. var previousNode = null;
  58. var index = 0;
  59. if( position === 0 ){
  60. newNode.next = currentNode;
  61. head = newNode;
  62. }
  63. else{
  64. while ( index++ < position ){
  65. previousNode = currentNode;
  66. currentNode = currentNode.next;
  67. }
  68. // 出了循环表示找到位置
  69. newNode.next = currentNode;
  70. previousNode.next = currentNode;
  71. }
  72. length++;
  73. return 1;
  74. }
  75. else{
  76. return -1;
  77. }
  78. }
  79. //查找链表中的某个元素所在位置, 无此元素返回 -1
  80. this.find = function(ele){
  81. var currentNode = head;
  82. var index = 0;
  83. while( currentNode ){
  84. if( currentNode.ele = ele ){
  85. return index;
  86. }
  87. currentNode = currentNode.next;
  88. index++;
  89. }
  90. return -1;
  91. }
  92. this.isEmpty = function(){
  93. return length === 0;
  94. }
  95. this.size = function(){
  96. return length;
  97. }
  98. }

下面来实现链表的反转

  1. function reverse( linkedList ){
  2. var head = linkedList.head;
  3. // 如果只有一个节点 或者 是空链表
  4. if( head === null || head.next === null ){
  5. return;
  6. }
  7. var p = head;
  8. var q = p.next;
  9. // 反转后的头结点变成尾节点
  10. head.next = null;
  11. while(q){
  12. r = q.next;
  13. q.next = p;
  14. p = q;
  15. q = r;
  16. }
  17. // 退出循环后 r = q.next = null, q.next = q; p=q; q=null;
  18. // p指向原来节点的尾节点, 那么翻转后,尾节点变成头结点
  19. linkedList.head = p;
  20. }

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    把每次翻转看成左右两个部分的翻转,比如第一次翻转时把左边的第一个节点看成左部分,把右边的第二个节点看成右部分,来进行翻转,第二次翻转时把左边的两个节点看成一个左部分,右边的第三

    相关

            单链表的翻转是一道很基本的算法题。         方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。         方法2:使用三个指针遍历单

    相关 数据结构实现

    实现思路: 1. 如果链表只有一个或者没有节点,则无需反转 2. 原链表的第一个节点即为反转后的最后一个元素,需要将其固定,我们叫它final 3. 按原链表的顺序