实现单链表

  1. class LList {
  2. constructor() {
  3. this.head = new ListNode("head");
  4. }
  5. find(val) {
  6. // 寻找节点
  7. let currNode = this.head;
  8. while (currNode && currNode.val !== val) {
  9. currNode = currNode.next;
  10. }
  11. return currNode;
  12. }
  13. add(val) {
  14. // 在链表尾部增加节点
  15. let currNode = this.head;
  16. const newNode = new ListNode(val);
  17. while (currNode.next !== null) {
  18. currNode = currNode.next;
  19. }
  20. currNode.next = newNode;
  21. }
  22. insert(val, preVal) {
  23. // 插入节点,先寻找要插入的节点,再在节点后面插入节点,节点可能不存在,不存在则在链表尾部插入节点
  24. let currNode = this.head;
  25. const newNode = new ListNode(val);
  26. while (currNode.next && currNode.val !== preVal) {
  27. currNode = currNode.next;
  28. }
  29. currNode.next = newNode;
  30. }
  31. remove(val) {
  32. // 寻找到被删除节点的前驱节点,然后连接其后继节点
  33. let currNode = this.head;
  34. while (currNode.next) {
  35. if (currNode.next.val === val) {
  36. currNode.next = currNode.next.next; // 前驱节点连接其后继节点的后继节点
  37. break;
  38. }
  39. currNode = currNode.next;
  40. }
  41. console.log("没找着");
  42. }
  43. display() {
  44. // 逐个打印节点
  45. if (this.head.next === null) {
  46. console.log("空的");
  47. return;
  48. }
  49. let currNode = this.head.next;
  50. while (currNode !== null) {
  51. console.log(currNode.val);
  52. currNode = currNode.next;
  53. }
  54. }
  55. }
  56. function ListNode(val) {
  57. // 生成节点
  58. this.val = val;
  59. this.next = null;
  60. }

实现循环链表

  1. class CSLList {
  2. constructor() {
  3. this.first = null;
  4. }
  5. insert(name, no) {
  6. if (this.first === null) {
  7. // 第一个节点的后继指向自己
  8. this.first = new Node(name, no);
  9. this.first.next = this.first;
  10. } else {
  11. let newNode = new Node(name, no);
  12. let flag = false; //通过这个标志判断是不是存在这个编号
  13. let currNode = this.first;
  14. let preNode = this.first
  15. while (true) {
  16. if (preNode.no < newNode.no &&currNode.next.no > newNode.no) break; // 找到插入数据的位置
  17. if (currNode.no > currNode.next.no && currNode.no < newNode.no) break; // 已经遍历到最大数字的位置,并且最大数字比插入的数字小,所以插入最后
  18. if (currNode.next.no === newNode.no) {
  19. flag = true;
  20. break;
  21. } //有重复编号的数据存在
  22. preNode = currNode
  23. currNode = currNode.next;
  24. }
  25. if (flag) {
  26. console.log("已存在相同编号数据");
  27. } else {
  28. newNode.next = currNode.next;
  29. currNode.next = newNode;
  30. }
  31. }
  32. }
  33. remove(countNo) {
  34. if (this.first === null) {
  35. console.log("空的");
  36. return null;
  37. }
  38. if (this.first.next === this.first) {
  39. console.log("移除了" + this.first.no + this.first.name);
  40. this.first = null;
  41. return null;
  42. }
  43. if (!countNo || countNo < 1) {
  44. console.log("入参错误");
  45. return null;
  46. }
  47. for (let i = 0; i < countNo - 1; i++) {
  48. // 向后移动countNo - 1个位置,然后删除该位置元素
  49. this.getNext();
  50. }
  51. let temp = this.first.next;
  52. this.first.next = this.first.next.next;
  53. console.log("移除了" + temp.no + temp.name);
  54. return temp.no;
  55. }
  56. getNext() {
  57. // 往后移动一位
  58. if (this.first === null) {
  59. console.log("空的");
  60. return;
  61. }
  62. this.first = this.first.next;
  63. }
  64. length() {
  65. if (this.first === null) {
  66. return 0;
  67. }
  68. let count = 1;
  69. let temp = this.first;
  70. while (temp.next !== this.first) {
  71. // 累加到找到自身
  72. count++;
  73. temp = temp.next;
  74. }
  75. return count;
  76. }
  77. display() {
  78. if (this.first === null) {
  79. console.log("空的");
  80. return;
  81. }
  82. let temp = this.first;
  83. while (temp.next !== this.first) {
  84. // 依次打印节点信息
  85. console.log(temp.no + temp.name);
  86. temp = temp.next;
  87. }
  88. }
  89. }
  90. function ListNode(val, no) {
  91. // 生成节点
  92. this.val = val;
  93. this.no = no;
  94. this.next = null;
  95. }

用循环链表实现约瑟夫问题

  1. class CSLList {
  2. constructor() {
  3. this.first = null;
  4. }
  5. insert(name, no) {
  6. if (this.first === null) {
  7. // 第一个节点的后继指向自己
  8. this.first = new ListNode(name, no);
  9. this.first.next = this.first;
  10. } else {
  11. let newNode = new ListNode(name, no);
  12. let flag = false; //通过这个标志判断是不是存在这个编号
  13. let currNode = this.first;
  14. if (currNode.next !== currNode) { // 当节点数大于1时
  15. while (true) {
  16. if (currNode.next.no > newNode.no) break; // 找到插入数据的位置
  17. if (currNode.no > currNode.next.no) break; // 已经遍历到最大数字的位置,所以插入到此位置
  18. if (currNode.next.no === newNode.no) {
  19. flag = true;
  20. break;
  21. } //有重复编号的数据存在
  22. currNode = currNode.next;
  23. }
  24. }
  25. if (flag) {
  26. console.log("已存在相同编号数据");
  27. } else {
  28. newNode.next = currNode.next;
  29. currNode.next = newNode;
  30. }
  31. }
  32. }
  33. remove(countNo) {
  34. if (this.first === null) {
  35. console.log("空的");
  36. return null;
  37. }
  38. if (this.first.next === this.first) {
  39. console.log("移除了" + this.first.no + this.first.name);
  40. this.first = null;
  41. return null;
  42. }
  43. if (!countNo || countNo < 1) {
  44. console.log("入参错误");
  45. return null;
  46. }
  47. for (let i = 0; i < countNo - 1; i++) {
  48. // 向后移动countNo - 1个位置,然后删除该位置元素
  49. this.getNext();
  50. }
  51. let temp = this.first.next;
  52. this.first.next = this.first.next.next;
  53. console.log("移除了" + temp.no + temp.name);
  54. return temp.no;
  55. }
  56. getNext() {
  57. // 往后移动一位
  58. if (this.first === null) {
  59. console.log("空的");
  60. return;
  61. }
  62. this.first = this.first.next;
  63. }
  64. length() {
  65. if (this.first === null) {
  66. return 0;
  67. }
  68. let count = 1;
  69. let temp = this.first;
  70. while (temp.next !== this.first) {
  71. // 累加到找到自身
  72. count++;
  73. temp = temp.next;
  74. }
  75. return count;
  76. }
  77. display() {
  78. if (this.first === null) {
  79. console.log("空的");
  80. return;
  81. }
  82. let temp = this.first;
  83. while (temp.next !== this.first) {
  84. // 依次打印节点信息
  85. console.log(temp.no + temp.name);
  86. temp = temp.next;
  87. }
  88. }
  89. }
  90. function ListNode(val, no) {
  91. // 生成节点
  92. this.name = val;
  93. this.no = no;
  94. this.next = null;
  95. }
  96. function Joseph() {
  97. let llist = new CSLList();
  98. for (let i = 0; i < 20; i++) {
  99. llist.insert("小孩" + (i + 1), i + 1);
  100. }
  101. let countNo = 5;
  102. while (llist.remove(countNo) !== null) {}
  103. }
  104. Joseph();