从链表中删除所有节点(给定开始和结束索引)

时间:2014-03-07 03:06:38

标签: java linked-list nodes

除了removeRange()start index作为参数之外,我正在编写一个额外的end index方法。我已经通过了所有条件,除非节点数等于从开始到结束的范围。

示例我的链接列表包含:

1 -> 2 -> 3
调用方法removeRange(0,2)

列表应该变为null,因为从0到2,计数为3,我的列表中也有3个元素。

如果可以,请查看图片以更好地了解正在发生的事情。

enter image description here

代码:

public void removeRange(int start, int end) {
    if(start < 0 || end < 0) {
        throw new IllegalArgumentException();
    } 
    if(start == 0 && end == 0) {
        front = front.next;
    } else if (start == 0 && end == 1) {
        front = front.next.next;
    } else {
        ListNode head = front;
        for(int i = 0; i < start-1;i++) {
            head = head.next;
        }
        ListNode tail = front;
        for(int i = 0; i < end;i++) {
            tail = tail.next;
        }
        head.next = tail.next;
    }
}

2 个答案:

答案 0 :(得分:2)

编码任何链接数据结构(列表,树,图)的最佳方法是获取白板,并绘制链表。然后,对于测试输入,一次一行地执行代码,就像计算机执行它一样。对于每一行,对绘制的版本进行相应的更改。在某些时候,代码会告诉您绘制一些您知道不对的东西,并告诉您问题所在。

我在代码中注意到的一件事是,您不确定输入范围是否与列表的大小相符。如果列表长度为5个节点,有人调用removeRante(10,12)?

,该怎么办?

对于这个特殊问题,你有4个案例,你应该按照这个顺序测试和处理它们。 。 1. Start = head和End = tail,此时你的head和tail都为null,从而清空链表 2.开始=头。移动头指向结束+ 1。 3.结束=尾巴。移动尾巴开始 - 1.
4.其他一切。 Head = start + 1,tail = end - 1.

答案 1 :(得分:1)

假设您tail.next == null,那么您仍然需要设置front = head,就像之前更新front的情况一样。