这个题我在真的面试过程中见过。
func reverseList(head *ListNode)*ListNode{
// 首先记住顺序不变还是从左到右,左边依然是pre,右边依然是cur
// 只不过我们的格式变了,之前是cur的next在后面,现在它的next在前面。
var prev *ListNode // 注意这里要给prev命名为nil的时候一定要指明它到底是什么类型的nil
cur := head
for cur != nil {
cur.Next,prev,cur = prev,cur,cur.Next // 这是一个语法糖,意思就是 这几个参数不会相互影响,他们后面的pre cur cur.Next 都是原来的参数,不会因为中间的赋值导致后面的数据发生改变,举个例子 a,b := b,c 意思其实是 a = b t= a a = b b = t
}
return prev
}
这种解法我是利用了一个数组,把链表的数据放到数组中,然后把数组给调转了顺序,然后再把链表给组成一下,额,反正没有第一种简洁,不过呢这也是一种解法,我还是写出来了
func reverseList(head *ListNode) *ListNode {
if head == nil {
return nil
}
arr := make([]*ListNode,0,0)
var cur *ListNode
cur = head
// 将链表的数据放到切片中
for cur != nil {
arr = append(arr,cur)
cur = cur.Next
}
// 翻转这个切片
for i := 0;i < len(arr)/2;i++ {
arr[i],arr[len(arr)-i-1] = arr[len(arr)-i-1] ,arr[i]
}
// 重组这个链表
for i := 0;i < len (arr);i++ {
cur = arr[i]
if i < len(arr)-1{
cur.Next = arr[i+1]
}else {
cur.Next = nil
}
cur = cur.Next
}
return arr[0]
}