面試:反轉鏈表

題目:反轉鏈表node

要求:定義一個函數,輸入一個鏈表的頭節點,反轉該鏈表並輸出反轉後鏈表的頭節點。面試

示例:segmentfault

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

限制:函數

0 <= 節點個數 <= 5000spa

反轉鏈表算是面試中比較常見的一個關於鏈表的題,總體上難度不大,但若是你能掌握多種的解法,每每能夠讓面試官眼前一亮指針

注意提醒一點,在面對鏈表的面試題時,建議多畫一下圖理解一下code

解法1:簡單雙指針

1.gif

經過雙指針,遍歷 head 指針,經過中間變量,逐步指向新的 head 節點,完成鏈表反轉blog

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }

    var newHead *ListNode
    for head != nil {
        node := head.Next
        head.Next = newHead
        newHead = head
        head = node
    }

    return newHead
}

結果以下:遞歸

file

還有一種簡化的寫法,在同一步操做中,改變各個變量對應的值,能夠省去中間變量,但這樣閱讀其實並不友好leetcode

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }

    var newHead *ListNode
    for head != nil {
        head, head.Next,newHead = head.Next, newHead, head
    }

    return newHead
}

file

解法2:遞歸

總體思路是遞歸到最後一個節點,這個節點就是鏈表反轉後的頭節點,這裏記做 ret,最終只須要返回這個 ret 指針便可,剩餘的都是對中間數據進行指針反轉。

具體要怎麼分析呢?這樣就要畫個圖了

file

2.gif

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }

    ret := reverseList(head.Next)
    head.Next.Next = head
    head.Next = nil
    return ret
}

遞歸去作其實不太容易理解,但也不失爲一個巧妙的方法:

file

解法3:雙頭指針

這個解法是參考 leetcode 大神的題解的,跟雙指針的解法有點像,但更巧妙

3.gif

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }

    cur := head
    for head.Next != nil {
        t := head.Next.Next
        head.Next.Next = cur // 反轉原指針方向
        cur = head.Next // 將新頭節點移到下一位
        head.Next = t // 鏈接回斷開的地方,繼續重複上面操做
    }

    return cur
}

效果跟簡單的雙指針沒差多少:

file

歡迎關注公衆號:若魚治水,文章會首發在公衆號,也可備註加我備註進羣進技術交流羣~
相關文章
相關標籤/搜索