PAT乙 1025 反转链表 (GO语言)

解题思路:
这题花的时间最久,起初没有什么思路,一直在考虑链表的反转问题,还有递归什么的,感觉反而把问题想复杂了,还是直接用数组来模拟最简单。
测试点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]
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值