首頁 > 後端開發 > Golang > golang單鍊錶倒轉

golang單鍊錶倒轉

WBOY
發布: 2023-05-15 11:09:08
原創
632 人瀏覽過

前言

在電腦科學中,鍊錶是一種基本的資料結構,它由一系列節點組成,節點透過指標來相互連結。鍊歷可以方便地實現插入和刪除操作,但是存取操作的效能相對較差,因為需要透過遍歷來尋找元素。本文將介紹如何使用Golang實作單鍊錶的倒轉演算法。

單鍊錶的定義

在Golang中,我們可以使用結構體來定義單鍊錶。定義一個結構體Node,表示單鍊錶的節點,其中包含了該節點的值val和它指向下一個節點位置的指標next。

type Node struct {
    val  int
    next *Node
}
登入後複製

定義一個head指針,指向鍊錶的頭節點。如果鍊錶為空,head指向nil。

var head *Node = nil
登入後複製

單鍊錶的初始化

在Golang中,我們可以使用new函數來分配一個節點的內存,並傳回該節點的指標。

func newNode(val int) *Node {
    return &Node{
        val,
        nil,
    }
}
登入後複製

建立一個單鍊錶,可以透過不斷的使用newNode新增節點來實現。以鍊錶1,2,3為例,程式碼如下:

node1 := newNode(1)
node2 := newNode(2)
node3 := newNode(3)
  
node1.next = node2
node2.next = node3
head = node1
登入後複製

單鍊錶的倒轉

有兩種方法可以實現單鍊錶的倒轉:迭代和遞歸。

方法一:迭代

迭代法的核心思想是遍歷鍊錶,並且把目前節點的指標指向前一個節點,以此達到倒轉的目的。

具體實作過程如下:

  • 定義三個指標:prev, head, next
  • 遍歷鍊錶,將head的next指標指向prev
  • #將prev指標指向head
  • 將head指向next
  • 重複上述步驟,直到head為空為止

Golang實作程式碼如下:

func reverseList1(head *Node) *Node {
    var prev *Node = nil
    var next *Node = nil
  
    for head != nil {
        next = head.next
        head.next = prev
        prev = head
        head = next
    }
  
    return prev
}
登入後複製

方法二:遞歸

遞歸法的核心思想是先遞歸到鍊錶的末尾,然後再倒序返回已經遍歷的節點。

具體實作過程如下:

  • 遞歸到鍊錶結尾
  • #將該節點的next指向倒數第二個節點
  • 將倒數第二個節點的next指向空
  • 重複上述步驟,直到傳回原鍊錶的頭節點

Golang實作程式碼如下:

func reverseList2(head *Node) *Node {
    if head == nil || head.next == nil {
        return head
    }
  
    newHead := reverseList2(head.next)
    head.next.next = head
    head.next = nil
  
    return newHead
}
登入後複製

完整的程式碼如下:

package main
  
import (
    "fmt"
)
  
type Node struct {
    val  int
    next *Node
}
  
func newNode(val int) *Node {
    return &Node{
        val,
        nil,
    }
}
  
var head *Node
  
func reverseList1(head *Node) *Node {
    var prev *Node = nil
    var next *Node = nil
  
    for head != nil {
        next = head.next
        head.next = prev
        prev = head
        head = next
    }
  
    return prev
}
  
func reverseList2(head *Node) *Node {
    if head == nil || head.next == nil {
        return head
    }
  
    newHead := reverseList2(head.next)
    head.next.next = head
    head.next = nil
  
    return newHead
}
  
func main() {
    node1 := newNode(1)
    node2 := newNode(2)
    node3 := newNode(3)
  
    node1.next = node2
    node2.next = node3
  
    head = node1
  
    fmt.Println("原链表:")
    for head != nil {
        fmt.Printf("%d->", head.val)
        head = head.next
    }
  
    head = node1
    head = reverseList1(head)
  
    fmt.Println("
迭代法倒转后的链表:")
    for head != nil {
        fmt.Printf("%d->", head.val)
        head = head.next
    }
  
    head = node1
    head = reverseList2(head)
  
    fmt.Println("
递归法倒转后的链表:")
    for head != nil {
        fmt.Printf("%d->", head.val)
        head = head.next
    }
}
登入後複製

運行結果如下:

原链表:
1->2->3->
迭代法倒转后的链表:
3->2->1->
递归法倒转后的链表:
3->2->1->
登入後複製

結語

本文介紹如何使用Golang實作單鍊錶的倒轉,並介紹了兩種不同的實作方法:迭代和遞歸。相信透過本文的學習,大家已經掌握了這兩種方法的核心思想,能夠靈活地應用在實際開發中。

以上是golang單鍊錶倒轉的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板