时间限制:10.000S 空间限制:128MB
题目描述
根据一个整数序列构造一个单链表,然后将其反转。
例如:原单链表为 2 3 4 5 ,反转之后为5 4 3 2
输入描述
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开
输出描述
针对每组测试数据,输出包括两行,分别是反转前和反转后的链表元素,用空格隔开
如果链表为空,则只输出一行,list is empty
输入示例
5 1 2 3 4 5
0
输出示例
1 2 3 4 5
5 4 3 2 1
list is empty
提示信息
本题用数组,也是可有过的,输入一遍数组,然后倒叙输出。不过建议大家用本题来链表操作
答案
注意:本题一次读取一行数据时,要把缓冲区加大,因为测试数据会有一行很长的情况
package main
import (
"bufio"
"os"
"fmt"
"strings"
"strconv"
)
var (
line []byte
err error
n int
arr []string
)
func main() {
reader := bufio.NewReaderSize(os.Stdin, 1024 * 1024)
for {
line, _, err = reader.ReadLine()
if err != nil {
break
}
arr = strings.Fields(string(line))
n, _ = strconv.Atoi(arr[0])
if n == 0 {
fmt.Println("list is empty")
continue
}
arr = arr[1:n + 1]
dummy := &LinkedListNode{}
cur := dummy
for _, str := range arr {
cur.Next = &LinkedListNode{ Val: str }
cur = cur.Next
}
printLinkedList(dummy.Next)
dummy.Next = reverseLinkedList(dummy.Next)
printLinkedList(dummy.Next)
}
}
type LinkedListNode struct {
Val string
Next *LinkedListNode
}
func printLinkedList(head *LinkedListNode) {
cur := head
for cur.Next != nil { // 题目保证了链表长度大于 0
fmt.Printf("%s ", cur.Val)
cur = cur.Next
}
fmt.Printf("%s\n", cur.Val)
}
func reverseLinkedList(head *LinkedListNode) *LinkedListNode {
var (
cur = head
prev *LinkedListNode
next *LinkedListNode
)
for cur != nil {
next = cur.Next
cur.Next = prev
prev = cur
cur = next
}
return prev
}