【问题标题】:Delete the element at index N, LinkedList删除索引 N 处的元素,LinkedList
【发布时间】:2017-02-18 06:51:47
【问题描述】:

这是作业

我被要求从 LinkedList 中删除第 k 个元素。我还得到了它的大小int N。问题是如何在删除位置“k”的节点后更新列表的大小?如果我的代码逻辑有问题,请指出。

我不想要解决方案只是指导,谢谢。

int N;               
Node first;         

// delete the kth element (where k is between 0 and N-1 inclusive)
public void delete (int k) {
    if (k < 0 || k >= N)
        throw new IllegalArgumentException();
    Node x = first;
    if( k == 0){
        first = x.next;
        N = N - 1;
    }
    for(int i = 1; i < k; i++){
        x = x.next;
        N = N - 1;
    }
    x.next = x.next.next;
    N = N - 2;
}

我认为我的列表大小 (int N) 可能有问题。

【问题讨论】:

  • 删除一个元素后列表的大小不是总是会减一吗?
  • 另外,这是单链表还是双链表?
  • 单链表
  • 为什么要手动从列表中删除项目?据我所知,LL 有自己的删除(或我不记得的删除)方法,它将处理所需的任何转移和重新链接。
  • OP 正在编写他们的自己的 链表实现,而不是使用java.util.LinkedList。

标签: java list linked-list nodes


【解决方案1】:

删除节点时,只需将之前的Node的next更改为k中的(新)下一个节点并递减N(N--)即可更新列表大小。

编辑

还要注意你的 for 循环,你正在更改节点 k 之前的所有节点中的下一个

【讨论】:

    【解决方案2】:

    考虑做两种情况:k == 0 和其他情况。 大小由 N 给出,因此新大小应为 N - 1。

    Node x = first; // What a name
    if (k == 0) {
        first = x.next; // Could be first = first.next
        N = N - 1;
        // Are you done here?
    }
    
    for (int i = 1; i < k; i++) {
        x = x.next;
        // Really? N = N - 1;
    }
    x.next = x.next.next;
    // Really? N = N - 2;
    N = N - 1;
    

    【讨论】:

      【解决方案3】:

      尝试使用 LinkedList 中定义的list.remove(Object obj) 方法。要获取第 k 个元素处的对象,可以使用list.get(int index)。找到第 k 个元素后,考虑中断或返回以避免任何并发修改问题或与索引相关的错误。

      【讨论】:

      • OP 正在编写他们的自己的 链表实现,而不是使用java.util.LinkedList。在回答之前阅读整个问题总是有帮助的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多