2021-02-09:如何删除一个链表的倒数第n个元素?
福哥答案2021-02-09:

1.创建虚拟头元素,虚拟头元素的Next指针指向头元素。
2.根据快慢指针求倒数第n+1个元素,假设这个元素是slow。
3.设置元素slow的Next指针。slow.Next=slow.Next.Next。
4.返回虚拟头元素的Next指针。

代码用golang编写,代码如下:

package main

import "fmt"

type ListNode struct {
    Val  int
    Next *ListNode
}

func main() {
    head := &ListNode{}
    head.Val = 1

    head.Next = &ListNode{}
    head.Next.Val = 2

    head.Next.Next = &ListNode{}
    head.Next.Next.Val = 3

    head.Next.Next.Next = &ListNode{}
    head.Next.Next.Next.Val = 4

    ret := head
    for ret != nil {
        fmt.Print(ret.Val, " ")
        ret = ret.Next
    }

    fmt.Println("\r\n-------")
    k := 4
    fmt.Println("删除倒数第", k, "个元素后:")

    ret = DeleteNode(head, k)
    for ret != nil {
        fmt.Print(ret.Val, " ")
        ret = ret.Next
    }
}
func DeleteNode(head *ListNode, k int) *ListNode {
    preHead := &ListNode{}
    preHead.Next = head

    fast := preHead
    slow := preHead

    k++
    for k > 0 {
        fast = fast.Next
        k--
    }

    for fast != nil {
        fast = fast.Next
        slow = slow.Next
    }

    slow.Next = slow.Next.Next

    return preHead.Next
}

执行结果如下:

图片说明


评论