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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务