Skip to content

Latest commit

 

History

History
54 lines (47 loc) · 1.7 KB

206.md

File metadata and controls

54 lines (47 loc) · 1.7 KB

Reverse Linked list

解法一

这个题我在真的面试过程中见过。

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]
}