时间限制:30.000S  空间限制:128MB

题目描述

根据一个递增的整数序列构造有序单链表,删除其中的重复元素

输入描述

输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开

输出描述

针对每组测试数据,输出包括两行,分别是删除前和删除后的链表元素,用空格隔开

如果链表为空,则只输出一行,list is empty

输入示例
5 1 2 3 4 5
5 1 1 2 2 3
0
输出示例
1 2 3 4 5 
1 2 3 4 5 
1 1 2 2 3 
1 2 3 
list is empty

答案

package main
 
import (
    "bufio"
    "os"
    "fmt"
    "strings"
    "strconv"
)
 
var (
    line []byte
    err error
    arr []string
    n int
    dummy *LinkedListNode
    cur *LinkedListNode
)
 
func main() {
    reader := bufio.NewReaderSize(os.Stdin, 1 << 20)
    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)
        deleteSameVal(dummy.Next)
        printLinkedList(dummy.Next)
    }
}
 
type LinkedListNode struct {
    Val string
    Next *LinkedListNode
}
 
func printLinkedList(head *LinkedListNode) {
    for head != nil && head.Next != nil {
        fmt.Printf("%s ", head.Val)
        head = head.Next
    }
    if head != nil {
        fmt.Println(head.Val)
    } else {
        fmt.Println()
    }
}
 
func deleteSameVal(head *LinkedListNode) {
    for head != nil && head.Next != nil {
        if head.Val == head.Next.Val {
            head.Next = head.Next.Next
        } else {
            head = head.Next
        }
    }
}