除了removeRange()
和start index
作为参数之外,我正在编写一个额外的end index
方法。我已经通过了所有条件,除非节点数等于从开始到结束的范围。
示例我的链接列表包含:
1 -> 2 -> 3
调用方法removeRange(0,2)
后:
列表应该变为null
,因为从0到2,计数为3,我的列表中也有3个元素。
如果可以,请查看图片以更好地了解正在发生的事情。
代码:
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;
}
}
答案 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
的情况一样。