简体   繁体   中英

Deleting all occurrences in a circular linked list. (java)

I want to implement a method that deletes all occurences of a certain value given as argument.
I created 2 temporary elements and referenced them to the head and I will be browsing the list using them. I was able to write a whole code but I'm not getting any result, I don't know where the problem is, neither I am getting an error.

Any help would be appreciated.

This is the method (my approach):

public void deleteAllOccurrences(int value) {
        Element cur = this.head;
        Element prev = null;
        
        //deleting head
        while(cur != this.rear && cur.data == value) {
            cur.next = this.head;
            cur = this.head;
        }
        
        while(cur != this.rear) {
            while(cur != this.rear && cur.data != value) {
                prev = cur;
                cur = cur.next;
            }
            if(cur == this.rear)
                return;
            
            prev.next = cur.next;
            cur = prev.next;
        }
    }

An this is the whole class maybe you need to check something:


public class CircularLinkedList {
    
class Element{
        
        int data;     // int type used as example
        Element next; // reference of the successor
        
        Element(int value) {
            this.data = value;
            this.next = this;
        }
        
    }

    private Element head = null;
    private Element rear = null;

    public CircularLinkedList() {
        this.head = this.rear = null;
    }
    
    
    public boolean isEmpty() {
        return head == null;
    }
    
    
    public boolean findValue(int value) {
        Element cur = this.head;
        
        while(cur != null) {
            if (cur.data == value)
                return true;
            cur = cur.next;
        }
        return false;
    }
    
    
    public int countValue(int value) {
        int c = 0; // counter
        Element cur = this.head;
        
        if(cur == null) 
            return 0;
        
        do {
            if(cur.data == value) 
                c++;
            cur = cur.next;
            
        }while (cur != this.head);
            
        return c;
    }
    
    
    @Override
    public String toString() {
        String str = "";
        Element cur = this.head;
        
            if(cur == null) 
                return "The list is empty";
        
            do {
                str += cur.data + " | ";
                cur = cur.next;
            
            }while (cur != this.head);
            
        return str;
        }
    
    
    
    public void insert(int value) {
        Element tmp = new Element (value);
        
        //special case: empty list
        if(this.head == null) {
            this.head = tmp;
            
        }else { // general case
            tmp.next = this.head.next;
            this.head.next = tmp; 
        }
            
    }
    
    
    public void deleteAtHead() {
        if(this.head == null) {
            return;
        }
        else {
            if(this.head != this.rear) {
                this.head = this.head.next;
                this.rear.next = this.head;
            }
        else {
            this.head = this.rear = null;
            }
        }
        
    }
    
        
    public boolean delete(int value) {
        Element cur = this.head;
        
        if(this.head.data == value) {                  //if the node to be deleted is head node
        
            while(cur.next != this.head) {         //iterate till the last node i.e. the node which is pointing to head         
                cur = cur.next;
            }
            cur.next = cur.next.next;       // update current node pointer to next node of head
            this.head = this.head.next;                //update head node
            return true;
        }
        else {                              // if node to be deleted is other than head node
        
            Element prev = cur;               // track previous node from current (node)
            while(cur.data != value) {       // find the node           
                prev = cur;
                cur = cur.next;
            }
            prev.next = cur.next; //updating next field of previous node to next of current node.current node deleted
            return true;
        }
    }
    
    
    
    public void deleteEven() {
//      if(this.head == null)
//          return;
//      
//      //case of deleting the head
//      if(this.head.data % 2 == 0) {
//          this.head.next = this.head;
//          this.rear.next = this.head;
//      if(this.head == null) 
//          this.rear = null;
//      }
//      
//      Element cur = this.head;
//      Element prev = cur;
//      while(cur != this.head) {
//          prev = cur;
//          cur = cur.next;
//      }
//      prev.next = cur.next;
        
        if(this.head == null)
            return;
        Element cur = this.head;
        while(cur != this.rear) {
            if(cur.data % 2 == 0)
                this.delete(cur.data);
            cur = cur.next;
        }
    }
    
    
    public void deleteLastOccurence(int value) {
        Element cur = this.head;
        Element prev = null;
        Element tmp = null;
        
        if(this.head == null)
            return;
        
        if(this.head.data == value) {
            this.head = null;
            return;
        }
        
        while(cur != this.rear) {
            if(cur.next != null && cur.next.data == value) {
                prev = cur;
                tmp = cur.next;
            }
            cur = cur.next;
        }
        prev.next = tmp.next;
    }
    
    
    public void deleteAllOccurrences(int value) {
        Element cur = this.head;
        Element prev = null;
        
        //deleting head
        while(cur != this.rear && cur.data == value) {
            cur.next = this.head;
            cur = this.head;
        }
        
        while(cur != this.rear) {
            while(cur != this.rear && cur.data != value) {
                prev = cur;
                cur = cur.next;
            }
            if(cur == this.rear)
                return;
            
            prev.next = cur.next;
            cur = prev.next;
        }
    }
    
    
//  public CircularLinkedList union(CircularLinkedList a, CircularLinkedList b) {
//      
//  }
//  
//  
//  public CircularLinkedList inter(CircularLinkedList a, CircularLinkedList b) {
//      
//  }
    
    
    public int countOddNbrs() {
        if(this.head == null)
            return 0;
        
        int c = 0;
        Element cur = this.head;
        do {
            if(cur.data % 2 != 0)
                c++;
            cur = cur.next;
        }while(cur != this.head);
        return c;
    }

    
//  public int findLastOccurence(int value) {
//      
//  }
    
    

    public static void main(String[] args) {

        CircularLinkedList list = new CircularLinkedList();
        list.insert(8);
        list.insert(2);
        list.insert(4);
        list.insert(3);
        list.insert(10);
        list.insert(5);
        list.insert(-8);
        list.insert(4);     
        System.out.println(list);
        
//      System.out.println(list.findValue(2)); // working
        
//      list.delete(2);  // working
//      System.out.println(list);
                
//      System.out.println(list.countOddNbrs());  //working
        
//      list.deleteEven();  // not working
//      System.out.println(list);
        
//      list.deleteAtHead();  // not working
//      System.out.println(list);
        
//      list.deleteLastOccurence(4);  //not working
//      System.out.println(list);
        
        list.deleteAllOccurrences(4);
        System.out.println(list);

    }

}

your method is running to an infinite loop. Try something like this:

public void deleteAllOccurrences(int value) {
    Element cur = this.head;
    Element next = null;

    if (cur.data == value) {
        cur = cur.next;
        this.head = cur;
    }

    do {
        next = cur.next;
        if (next.data == value) {
            cur.next = next.next;
        }
        cur = next;

    } while (cur != this.head);

}

You should handle the corner cases too when the head is the removable element.

You are forgetting to update the rear in the insert() method, causing you to run into an infinite loop in the deleteAllOccurrences() method as you are looking for the rear node. It should look something like this:

        if (this.head == null) {
            this.head = tmp;
            this.rear = tmp;
        } else { // general case
            tmp.next = this.head.next;
            this.head.next = tmp;
            this.rear = tmp.next;
        }

Also note that in the deleteAllOccurrences() method you are failing to take into account that the last node could have the looked for value.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM