I have written a circular doubly-linked list with a dummy node at the front. During the initialization of my DLL class, I create the dummy node. When I use the debugger in jGrasp and use the visualization tool, after inserting several numbers, my dummy node gets shuffled around and does not stay at the front. I don't understand how I am modifying my linked list. As a preface, my node class has has an integer val and two pointers named prev and next. One thing I notice is that after the assignment statement curr = dummy, dummy node is shuffled to the curr from the previous insertion.
public class DLL {
Node curr;
Node help;
Node dummy = new Node(null, null, -1);
public DLL() {
this.curr = curr;
this.help = help;
dummy.next = dummy;
dummy.prev = dummy;
}
public boolean isEmpty() {
if (dummy.next == dummy && dummy.prev == dummy) {
return true;
}
return false;
}
public void push(int elem) {
if (isEmpty()) {
Node sec = new Node(dummy, dummy, elem);
dummy.next = sec;
dummy.prev = sec;
} else {
curr = dummy;
while (curr.next != dummy) {
curr = curr.next;
}
Node n = new Node(curr, dummy, elem);
curr.next = n;
dummy.prev = n;
}
}
public void reverse() {
curr = dummy;
help = dummy;
while (curr.next != help || curr != help) {
curr = curr.next; // increment curr
help = help.prev; // decrement help
swap(curr, help); // swap
}
}
public void swap(Node curr, Node help) {
int temp = curr.val;
curr.val = help.val;
help.val = temp;
}
public boolean contains(int elem) {
curr = dummy.next;
while (curr != dummy && elem != curr.val) {
curr = curr.next;
if (curr == dummy) {
return false;
}
}
return true;
}
}
Here is the small test class I used:
public class testDLL {
public static void main(String[] args) {
DLL dlink = new DLL();
dlink.push(4);
dlink.push(6);
dlink.push(3);
dlink.push(2);
assert dlink.contains(4) == true;
assert dlink.contains(6) == true;
assert dlink.contains(3) == true;
assert dlink.contains(2) == true;
dlink.reverse();
}
}