解题思路:
这题花的时间最久,起初没有什么思路,一直在考虑链表的反转问题,还有递归什么的,感觉反而把问题想复杂了,还是直接用数组来模拟最简单。
测试点5超时问题,如果用go实现,用bufio读入
测试点6,应该是输入的节点数据,有的并不是链表数据,也就是说真的链表长度和输入的N可能不一致
1.输入数据,用map[Address] = node。就是用map保存节点数据,以节点地址作为key
2.用数组模拟链表,循环把map中的数据 串成一条链表,按下标排列,顺便记录下真实节点个数n
3.接下去就是反转,其实就是交换位置
4.最后输出
这些只是用于解决本题,其实并没有去考虑指针next的值,如果用链表求解的话会比较复杂
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Node struct {
prev int
data int
next int
}
func main() {
var start int
var nodeSum int
var K int
var p,d,next int
var NodeMap map[int]Node
var nodeList []Node
_, _ = fmt.Scanf("%d %d %d", &start, &nodeSum, &K)
NodeMap = make(map[int]Node, nodeSum+1)
nodeList = make([]Node, nodeSum+1)
var inputReader *bufio.Reader
inputReader = bufio.NewReader(os.Stdin)
for i:=0; i<nodeSum; i++ {
str, _ := inputReader.ReadString('\n')//面对大量数据的输入时,还是得用bufio,不然第5个测试点会超时
strArray := strings.Fields(str)
p,_ = strconv.Atoi(strArray[0])
d,_ = strconv.Atoi(strArray[1])
next,_ = strconv.Atoi(strArray[2])
NodeMap[p] = Node{prev:p, data:d, next:next}
}
n := 1//真实链表数量
for true {
if _, ok := NodeMap[start]; ok {
nodeList[n] = NodeMap[start]
if nodeList[n].next == -1 {
break
}
n++
start = NodeMap[start].next
}
}
for i:=1; i<=n; i+=K {
if i + K - 1 > n {
break
} else {
reverseArray(nodeList, i,i+K-1)
}
}
for i:=1; i<=n; i++ {
if i == n {
fmt.Printf("%05d %d -1\n", nodeList[i].prev, nodeList[i].data)
} else {
fmt.Printf("%05d %d %05d\n", nodeList[i].prev, nodeList[i].data, nodeList[i+1].prev)
}
}
}
func reverseArray(nodeArray []Node, start, end int) {
for i,j:=start,end; i<j; i,j = i+1, j-1 {
nodeArray[i], nodeArray[j] = nodeArray[j], nodeArray[i]
}
}