【问题标题】:Sorted circular linked list not getting updated after the removal of element?删除元素后排序的循环链表没有得到更新?
【发布时间】:2015-08-18 08:22:06
【问题描述】:

我正在通过首先用排序的元素填充列表来实现一个排序的循环链表,并且还实现了插入和删除功能。但是,在调用 delete 时,它​​不会更新列表。我尝试在 delete 方法中调试代码,但还没有成功。下面是我的程序的代码sn-p。

class CNode {
    public int data;
    public CNode next;

    public CNode() {
        this.data = 0;
        this.next = null;
    }

    public CNode(int data, CNode next) {
        this.data = data;
        this.next = next;
    }

    public CNode(int data) {
        this.data = data;
        this.next = null;
    }
}

AND 驱动程序类 -

public class SortedCLL {
    public static CNode head = new CNode();
    public static CNode last = new CNode();
    public static int NoN;

    public SortedCLL() {
        int N = 3;
        int val[] = {4, 2, 6};
        Arrays.sort(val);
        CNode first = new CNode(val[0]);
        head.next = first;
        last.next = first;
        NoN++;

        for (int i = 1; i < N; i++) {
            CNode n = new CNode(val[i]);
            last.next.next = n;
            last.next = n;
            n.next = head.next;
            NoN++;
        }

        //DELETING AN ELEMENT
        delete(2);

        //INSERTING AN ELEMENT
        insert(7);

        CNode check = head.next;
        for (int i = 0; i < NoN; i++) {
            System.out.print(check.data + " ");
            check = check.next;
        }

    }

    public static void main(String args[]) throws Exception {
        new SortedCLL();
    }

    private void insert(int element) {
        CNode n = new CNode(element);
        if(element < head.next.data) {
            n.next = head.next;
            head.next = n;
            last.next.next = n;
            NoN++;
            return;
        }
        int nodes = NoN - 1;
        CNode iter =  head;
        while(nodes-- > 0){
            if(iter.data < element && iter.next.data > element) {
                n.next = iter.next;
                iter.next = n;
                NoN++;
                return;
            }
        }
        last.next.next = n;
        last.next = n;
        n.next = head.next;
        NoN++;
        return;
    }

    private void delete(int element) {
        //System.out.println( " :  " +element);
        CNode prev = last.next;
        CNode iter =  head.next;
        int nodes = NoN;
        while(nodes-- > 0) {
            if(iter.data == element) {
                //HERE IT IS PRINTING CORRECT PREV AND NEXT NODE'S DATA.
                System.out.println( prev.data + " :  " +iter.next.data);
                prev.next = iter.next;
                NoN--;
                return;
            }
            prev = iter;
            iter = iter.next;
        }
        return;
    }

}

检查SortedCLL类中的调试语句,在delete方法中,打印出正确的prev和next值,但输出还是不符合预期。

expected list

4 6 7

program's list

2 4 6 7

任何帮助表示赞赏!

【问题讨论】:

  • 我猜 CNode 中的静态 int 应该计算列表的大小?您最好将其保存在 SortedCLL 中。因为该类应该能够处理多个实例。
  • 此外,您应该在 main 而不是在构造函数中测试您的类。
  • 你明白了,但这仍然不能解决我的问题! :(
  • 您所说的是对这个问题进行编程的更好做法,但是即使这样做也不能解决我面临的问题。你能告诉如何解决实际问题。谢谢!

标签: java data-structures sortedlist circular-list


【解决方案1】:

您忘记了删除列表头部的边缘情况,需要在删除时执行head = head.next;

此外,您并没有真正处理任何地方的空列表的情况,所以要小心!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2017-04-25
    • 2013-04-28
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多