题解 | #输出单向链表中倒数第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 + 1 停止,一共 n - (k+1) + 1 n -k 个数 for n := list.Length; n > k; n-- { cur = cur.Next } // 开始输出倒数第k个结点的值 fmt.Println(cur.Val) } }