题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) // 链表结点 type Node struct { Val int Next *Node } // 单链表结构 - 带头节点和长度 type Singly struct { Head *Node Length int } // NewSingly 返回一个单链表实例 func NewSingly() *Singly { return &Singly{} } // NewNode 创建一个新节点 func NewNode(val int) *Node { return &Node{Val: val} } // AddAtEnd 在链表尾部添加一个新节点 func (ll *Singly) AddAtEnd(val int) { node := NewNode(val) if ll.Head == nil { ll.Head = node ll.Length++ return } cur := ll.Head for ; cur.Next != nil; cur = cur.Next { } cur.Next = node ll.Length++ } func main() { inputs := bufio.NewScanner(os.Stdin) for { if !inputs.Scan() { break } inputs.Scan() values := strings.Split(inputs.Text(), " ") inputs.Scan() k, _ := strconv.Atoi(inputs.Text()) // 构建单链表 list := NewSingly() // 添加结点 for _, value := range values { val, _ := strconv.Atoi(value) list.AddAtEnd(val) } cur := list.Head // 已知链表长度,所以倒数第 k 个结点在 length - k (从 0 开始计数) index := list.Length - k if index == 0 { fmt.Println(cur.Val) continue } for i := 0; i < list.Length - k; i++ { // 找到倒数第 k 个结点 cur = cur.Next } // 开始输出倒数第k个结点的值 fmt.Println(cur.Val) } }