题解 | #输出单向链表中倒数第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)
}
}