如何删除循环双链接列表中的节点?

5sxhfpxr  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(251)

我正在尝试编写一个程序,它将在一个循环双链接列表中前进一定的次数,并在同一个列表中后退一定的次数。如果两种方法都以相同的数字结束,则该数字为“值得”,并从列表中删除。如果这些方法不在列表中的同一个元素上结束,那么它们就没有价值,也会从列表中删除。我已经多次编写了前进和后退的方法,但是一旦元素被认为是有价值的或不值得的,我就很难删除它们。这就是我目前所拥有的。任何帮助都将不胜感激。

  1. import java.util.Arrays;
  2. public class LinkedList {
  3. private Node head;
  4. private Node end;
  5. LinkedList(){
  6. head = end = null;
  7. }
  8. public void addAtStart(int x){
  9. if (head == null) {
  10. Node new_node = new Node(x);
  11. new_node.data = x;
  12. new_node.next = new_node.prev = new_node;
  13. head = new_node;
  14. } else if (head != null) {
  15. Node last = (head).prev;
  16. Node new_node = new Node(x);
  17. new_node.data = x;
  18. new_node.next = head;
  19. (head).prev = new_node;
  20. new_node.prev = last;
  21. last.next = new_node;
  22. }
  23. }
  24. public void printOutput(int N, int k, int m){
  25. System.out.println("Output" + "\n" + "------" + "\n");
  26. printCandidates(N,k,m);
  27. }
  28. public void printCandidates(int N, int k, int m){
  29. int unworthy[] = new int[N];
  30. int worthy[] = new int[N];
  31. int count = 0;
  32. int run = 0;
  33. Node temp = head;
  34. do {
  35. if (forwards(k) == backwards(m)){ // puts in worthy list and deletes from linked list
  36. worthy[count] = forwards(k);
  37. count += 1;
  38. System.out.println("hello");
  39. deleteElement(forwards(k));
  40. } else if (forwards(k) != backwards(m)){ //put in unworthy list and delete from linked list
  41. unworthy[run] = forwards(k);
  42. unworthy[run+1] = backwards(m);
  43. run += 2;
  44. System.out.println("goodbye");
  45. deleteElement(forwards(k));
  46. deleteElement(backwards(m));
  47. }
  48. } while (temp != null);
  49. System.out.println("Removed candidates from being elected");
  50. System.out.println(Arrays.toString(unworthy));
  51. System.out.println("Worthy candidates");
  52. System.out.println(Arrays.toString(worthy));
  53. }
  54. int forwards(int k){
  55. int run = 0;
  56. int x = 0;
  57. Node temp = head;
  58. while (temp.next != head){
  59. if(run == (k)){
  60. x = temp.data;
  61. }
  62. temp = temp.next;
  63. run += 1;
  64. }
  65. return x;
  66. }
  67. int backwards(int m){
  68. int run = 0;
  69. int x = 0;
  70. Node temp = head;
  71. Node last = head.prev;
  72. temp = last;
  73. while (temp.next != head){
  74. if(run == (m)){
  75. x = temp.data;
  76. }
  77. temp = temp.next;
  78. run += 1;
  79. }
  80. return x;
  81. }
  82. public void deleteElement(int elementToBeDeleted){
  83. Node temp = head;
  84. while (temp.next != head){
  85. if(temp.data == elementToBeDeleted){
  86. temp.setNext(temp.next);
  87. }
  88. temp = temp.next;
  89. }
  90. }

这是我的司机:

  1. public class Program2 {
  2. public static void main(String[] args) {
  3. LinkedList ll = new LinkedList();
  4. for (int i = 1; i < 11; i++){
  5. ll.addAtStart(i);
  6. }
  7. int N = 10;
  8. int k = 4;
  9. int m = 3;
  10. System.out.println("N = " + N + ", " + "k = " + k + ", " + "m = " + m + "\n");
  11. ll.printOutput(N,k,m);
  12. }
  13. }

这是我的节点类:

  1. public class Node {
  2. public int data;
  3. public Node next;
  4. public Node prev;
  5. // Constructor to intialize/fill data
  6. public Node(int data){
  7. this.data = data;
  8. }
  9. // set the address of next node
  10. public void setNext(Node temp) {
  11. this.next = temp;
  12. }
  13. // get the address of next node
  14. public Node getNext(){
  15. return this.next;
  16. }
  17. public Node getPrev(){
  18. return this.prev;
  19. }
  20. public void setPrev(Node temp) {
  21. this.prev = temp;
  22. }
  23. // to get data of current node
  24. public int getData(){
  25. return this.data;
  26. }
  27. }

编辑:作为这个练习的一部分,我需要自己编写这个类,因此我需要实现自己的linkedlist。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题