当前位置:   article > 正文

Java中实现双向链表

Java中实现双向链表

一、目标

        最近项目中实现双向链表,同时转为满二叉树。

二、代码

        用java实现双向链表的代码如下:

  1. class TreeNode {
  2. int val;
  3. TreeNode left;
  4. TreeNode right;
  5. TreeNode(int x) { val = x; }
  6. }
  7. public class FullBinaryTree {
  8. public TreeNode createTree(int[] nums, int i) {
  9. if (i >= nums.length || nums[i] == -1) {
  10. return null;
  11. }
  12. TreeNode root = new TreeNode(nums[i]);
  13. root.left = createTree(nums, 2 * i + 1);
  14. root.right = createTree(nums, 2 * i + 2);
  15. return root;
  16. }
  17. public static int binarySearch(int[] nums, int target) {
  18. int left = 0;
  19. int right = nums.length - 1;
  20. while (left <= right) {
  21. int mid = left + (right - left) / 2;
  22. if (nums[mid] == target) {
  23. return mid;
  24. } else if (nums[mid] < target) {
  25. left = mid + 1;
  26. } else {
  27. right = mid - 1;
  28. }
  29. }
  30. return -1;
  31. }
  32. }
  33. class ListNode {
  34. int val;
  35. ListNode prev;
  36. ListNode next;
  37. ListNode(int x) { val = x; }
  38. }
  39. public class DoublyLinkedList {
  40. public ListNode createList(int[] nums) {
  41. ListNode dummy = new ListNode(-1);
  42. ListNode prev = dummy;
  43. for (int num : nums) {
  44. ListNode node = new ListNode(num);
  45. prev.next = node;
  46. node.prev = prev;
  47. prev = node;
  48. }
  49. return dummy.next;
  50. }
  51. public int find(ListNode head, int target) {
  52. ListNode curr = head;
  53. while (curr != null) {
  54. if (curr.val == target) {
  55. return curr.val;
  56. }
  57. curr = curr.next;
  58. }
  59. return -1;
  60. }
  61. public ListNode insert(ListNode head, int pos, int val) {
  62. ListNode dummy = new ListNode(-1);
  63. dummy.next = head;
  64. ListNode curr = dummy;
  65. while (pos > 0) {
  66. curr = curr.next;
  67. pos--;
  68. }
  69. ListNode node = new ListNode(val);
  70. node.prev = curr;
  71. node.next = curr.next;
  72. if (curr.next != null) {
  73. curr.next.prev = node;
  74. }
  75. curr.next = node;
  76. return dummy.next;
  77. }
  78. public ListNode modify(ListNode head, int pos, int val) {
  79. ListNode curr = head;
  80. while (pos > 0) {
  81. curr = curr.next;
  82. pos--;
  83. }
  84. curr.val = val;
  85. return head;
  86. }
  87. public ListNode delete(ListNode head, int pos) {
  88. ListNode dummy = new ListNode(-1);
  89. dummy.next = head;
  90. ListNode curr = dummy;
  91. while (pos > 0) {
  92. curr = curr.next;
  93. pos--;
  94. }
  95. ListNode node = curr.next;
  96. if (node.next != null) {
  97. node.next.prev = curr;
  98. }
  99. curr.next = node.next;
  100. return dummy.next;
  101. }
  102. public TreeNode toFullBinaryTree(ListNode head) {
  103. if (head == null) {
  104. return null;
  105. }
  106. List<Integer> nums = new ArrayList<>();
  107. ListNode curr = head;
  108. while (curr != null) {
  109. nums.add(curr.val);
  110. curr = curr.next;
  111. }
  112. int[] arr = nums.stream().mapToInt(Integer::intValue).toArray();
  113. FullBinaryTree fbTree = new FullBinaryTree();
  114. return fbTree.createTree(arr, 0);
  115. }
  116. }

在以上代码中,ListNode类表示双向链表中的节点,包含一个值和前后两个节点。DoublyLinkedList类中定义了六个方法,分别为:

  • createList方法用于根据给定的整数数组创建一个双向链表;
  • find方法用于在双向链表中查找目标元素,并返回其值;
  • insert方法用于在双向链表中插入新节点;
  • modify方法用于修改双向链表中的节点值;
  • delete方法用于删除双向链表中的节点;
  • toFullBinaryTree方法用于将双向链表转换为一棵满二叉树,并返回根节点。

具体实现见代码。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号