自己给公司做网站难不难,ui交互设计作品,企业邮箱登录入口126,陵水网站建设方案删除链表的倒数第N个节点 leetcode19
递归
由于本体是倒数第几个节点#xff0c;非常适合递归 从终到始 的运行方式
func removeNthFromEnd(head *ListNode, n int) *ListNode {// 创建一个虚拟头节点#xff0c;简化边界条件处理dummy : ListNode{Next: head}//检查…删除链表的倒数第N个节点 leetcode19
递归
由于本体是倒数第几个节点非常适合递归 从终到始 的运行方式
func removeNthFromEnd(head *ListNode, n int) *ListNode {// 创建一个虚拟头节点简化边界条件处理dummy : ListNode{Next: head}//检查是否需要删除头节点//if remove(dummy, n) n {// return dummy.Next//}remove(dummy, n)return dummy.Next
}func remove(node *ListNode, n int) int {//循环结束条件找到最后一个节点if node nil {return 0}index : remove(node.Next, n) 1//如果当前节点的下一个节点是目标节点if index n1 {node.Next node.Next.Next}return index
}
双指针法 迭代
双指针的经典应用如果要删除倒数第n个节点让fast移动n步然后让fast和slow同时移动直到fast指向链表末尾。删掉slow所指向的节点就可以了。 同时也使用了虚拟头节点的方式 还可以
// 双指针 迭代func removeNthFromEnd(head *ListNode, n int) *ListNode {dummyHead : ListNode{Next: head}fast, slow : dummyHead, dummyHead//fast和slow指针之间的差值var diff int//循环结束条件fast移动到最后一个节点for fast.Next ! nil {//如果差值到n则fast和slow指针都向后偏移即可if diff n {fast fast.Nextslow slow.Next} else { //差值不到n则只有fast指针移动直到满足差值要求fast fast.Nextdiff}}if diff n {slow.Next slow.Next.Next}return dummyHead.Next
}