Kotlin 当你试着;“按索引删除”;关于纯函数链表

Kotlin 当你试着;“按索引删除”;关于纯函数链表,kotlin,data-structures,linked-list,functional-programming,purely-functional,Kotlin,Data Structures,Linked List,Functional Programming,Purely Functional,正如标题所述,我一直试图在纯功能性实现上对单个链表及其操作进行编码。到目前为止还很轻松的事情,很多递归,没有修改。。。作品 然后,我尝试实现一个函数,在给定某个索引的情况下,从列表中删除一个元素。我一辈子都找不到一种不用计数器就能实现的方法。这几乎就像在问我自己,“我怎么知道自己走了多少步,而没有自己或观众数?” 从那以后,我一直处于低迷状态 以下是我目前掌握的代码: fun <T> removeFromIndex(list:ListNode<T>?, index

正如标题所述,我一直试图在纯功能性实现上对单个链表及其操作进行编码。到目前为止还很轻松的事情,很多递归,没有修改。。。作品

然后,我尝试实现一个函数,在给定某个索引的情况下,从列表中删除一个元素。我一辈子都找不到一种不用计数器就能实现的方法。这几乎就像在问我自己,“我怎么知道自己走了多少步,而没有自己或观众数?”

从那以后,我一直处于低迷状态

以下是我目前掌握的代码:

    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 removeFromIndex(列表:ListNode?,索引:Int):ListNode{
如果(列表?.data==null){
返回列表
}
否则{
何时(索引){
0->删除(列表)
其他->{
何时(列表大小(列表)-索引){
0 -> {
返回列表
}
1 -> {
removeFromTail(列表)
}
其他->{
TODO()//怎么做?
}
}
}
}
}
}
乐趣移除(列表:ListNode?):ListNode{
如果返回(列表?.data==null){
列表
}
否则{
下一个
}
}
趣味removeFromTail(列表:ListNode?):ListNode{
如果返回(列表?.data==null){
列表
}否则{
何时(列表。下一步){
空->空
其他->{
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)
    )
}
fun removeFromIndex(列表:ListNode?,索引:Int):ListNode?=什么时候{
列表==null | |索引<0->列表
索引==0->list.next
else->ListNode(
列表.数据,
removeFromIndex(list.next,index-1)
)
}

起初,在阅读您的答案时,我想“不,他是在递减索引,这不是纯粹的功能”,但您是在指定一个减法的值作为新索引,对吗?真不敢相信我竟然没有想到。这是一种一旦你得到,它就会发出咔嗒声的东西。谢谢你,马特!