题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// 链表结点
type Node struct {
Value int
Next *Node
}
// 链表结构-包含指向第一个结点的 head 指针
type Singly struct {
Head *Node
length int // 记录链表的长度
}
// 创建一个新节点
func NewNode(val int) *Node {
return &Node{val, nil}
}
// 创建一个新链表
func NewSingly() *Singly {
return &Singly{}
}
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()
var values []int
for _, v := range strings.Split(inputs.Text(), " ") {
val, _ := strconv.Atoi(v)
values = append(values, val)
}
l := NewSingly()
// 构建链表
for _, value := range values {
l.AddAtEnd(value)
}
// 读入 k
inputs.Scan()
k, _ := strconv.Atoi(inputs.Text())
// 使用fast, low指针
low := l.Head
fast := l.Head
// 让 fast 先走 k 个节点
for i := 0; i < k; i++ {
fast = fast.Next
}
// low 和 fast 同时开始走
for fast != nil {
low = low.Next
fast = fast.Next
}
// 打印当前 k 的值
fmt.Println(low.Value)
}
}
智元机器人成长空间 334人发布