交替分割链表golang

发布时间:2024-07-04 10:44:23

交替分割链表是一道常见的算法问题,对于golang开发者来说,解决这类问题是必不可少的。在本文中,我将为大家介绍交替分割链表的解法,以及如何使用golang实现该算法。

问题描述

给定一个链表,将其分割成两个部分,使得两个链表的元素交替出现。例如,给定链表1->2->3->4->5,分割后的链表应为1->3->5和2->4。

解法思路

要解决这个问题,我们可以使用两个指针,分别指向链表的奇数节点和偶数节点。然后将奇数节点组成一个链表,偶数节点组成另一个链表。最后将两个链表连接起来即可。

代码实现

下面是使用golang实现交替分割链表的代码:

type ListNode struct {
    Val  int
    Next *ListNode
}

func oddEvenList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    
    odd := head
    evenHead := head.Next
    even := evenHead
    
    for even != nil && even.Next != nil {
        odd.Next = even.Next
        odd = odd.Next
        even.Next = odd.Next
        even = even.Next
    }
    
    odd.Next = evenHead
    
    return head
}

代码思路很简单,首先判断链表是否为空或只有一个节点,如果是,则直接返回原链表。然后定义两个指针odd和even,分别指向链表的奇数节点和偶数节点。初始化奇数节点为头结点,偶数节点为头结点的下一个节点。然后通过迭代的方式将奇数节点和偶数节点连接起来,最后将奇数节点的末尾指向偶数节点的头部,完成交替分割链表的操作。

测试示例

为了验证我们的代码是否正确,我们可以使用一些示例进行测试。

func main() {
    // 创建链表1->2->3->4->5
    head := &ListNode{Val: 1}
    node2 := &ListNode{Val: 2}
    node3 := &ListNode{Val: 3}
    node4 := &ListNode{Val: 4}
    node5 := &ListNode{Val: 5}
    
    head.Next = node2
    node2.Next = node3
    node3.Next = node4
    node4.Next = node5
    
    // 交替分割链表
    newHead := oddEvenList(head)
    
    // 打印结果
    for newHead != nil {
        fmt.Println(newHead.Val)
        newHead = newHead.Next
    }
}

运行上述代码,我们可以得到交替分割链表的结果:

1
3
5
2
4

可以看到,原链表1->2->3->4->5被交替分割成了两个链表1->3->5和2->4。

总结

交替分割链表是一道常见的算法问题,本文通过使用golang实现了该算法。通过定义两个指针,分别指向奇数节点和偶数节点,然后将它们连接起来,最后将奇数节点的末尾指向偶数节点的头部,我们可以很容易地实现交替分割链表。希望本文对于你理解交替分割链表问题及其解决方案有所帮助。

相关推荐