尝试在纯功能链表上 "remove by index" 时出现问题
Troubles when trying to "remove by index" on a Purely functional Linked List
如标题所述,我一直在尝试编写单链表及其在纯函数实现上的操作。到目前为止,一切都非常轻松,很多递归,没有修改......作品。
然后我尝试实现一个函数,在给定特定索引的情况下从列表中删除一个元素。我一辈子都找不到不使用计数器就可以实现的方法。这几乎就像在问自己,"how to I know how many steps I have walked without myself or an spectator counting them?".
从那以后我就一直低迷。
这是我目前的代码:
fun <T> removeFromIndex(list:ListNode<T>?, index: Int):ListNode<T>?{
if(list?.data == null){
return list
}
else{
when(index){
0 -> remove(list)
else -> {
when(listSize(list) - index){
0 -> {
return list
}
1 -> {
removeFromTail(list)
}
else -> {
TODO()//HOW?
}
}
}
}
}
}
fun <T> remove(list: ListNode<T>?):ListNode<T>?{
return if(list?.data == null){
list
}
else{
list.next
}
}
fun <T> removeFromTail(list:ListNode<T>?):ListNode<T>?{
return if(list?.data == null){
list
} else{
when(list.next){
null -> null
else -> {
ListNode(list.data, removeFromTail(list.next))
}
}
}
}
非常感谢您的帮助和意见。
简单易行:
fun <T> removeFromIndex(list:ListNode<T>?, index: Int):ListNode<T>? = when {
list == null || index < 0 -> list
index == 0 -> list.next
else -> ListNode<T> (
list.data,
removeFromIndex(list.next, index-1)
)
}
如标题所述,我一直在尝试编写单链表及其在纯函数实现上的操作。到目前为止,一切都非常轻松,很多递归,没有修改......作品。
然后我尝试实现一个函数,在给定特定索引的情况下从列表中删除一个元素。我一辈子都找不到不使用计数器就可以实现的方法。这几乎就像在问自己,"how to I know how many steps I have walked without myself or an spectator counting them?".
从那以后我就一直低迷。
这是我目前的代码:
fun <T> removeFromIndex(list:ListNode<T>?, index: Int):ListNode<T>?{
if(list?.data == null){
return list
}
else{
when(index){
0 -> remove(list)
else -> {
when(listSize(list) - index){
0 -> {
return list
}
1 -> {
removeFromTail(list)
}
else -> {
TODO()//HOW?
}
}
}
}
}
}
fun <T> remove(list: ListNode<T>?):ListNode<T>?{
return if(list?.data == null){
list
}
else{
list.next
}
}
fun <T> removeFromTail(list:ListNode<T>?):ListNode<T>?{
return if(list?.data == null){
list
} else{
when(list.next){
null -> null
else -> {
ListNode(list.data, removeFromTail(list.next))
}
}
}
}
非常感谢您的帮助和意见。
简单易行:
fun <T> removeFromIndex(list:ListNode<T>?, index: Int):ListNode<T>? = when {
list == null || index < 0 -> list
index == 0 -> list.next
else -> ListNode<T> (
list.data,
removeFromIndex(list.next, index-1)
)
}