206. 反转链表

73 阅读1分钟

206. 反转链表

标签:循环、递归

思路

断键再重新组合键的过程

循环

  • 记录父节点和子节点,子节点不断遍历寻找下一个值,遍历过程中进行翻转
func reverseList(head *ListNode) *ListNode {
    var pre *ListNode  // 记录父节点

    for head != nil{
        // 遍历下一个节点
        ne := head.Next 
        // 断键重组
        head.Next = pre

        // 循环重新赋值
        pre = head
        head = ne
    }
    return pre
}

递归

三部曲:

  1. 确定传参以及返回值
    • 传参:重新组合需要父节点和子节点重新组合,所以需要pre、head两个节点
    • 返回值:重新组合后直接返回反转后的链表
  2. 确定终止条件
    • 当子节点为空节点的时候,返回父节点
  3. 确定单层循环
    • 翻转父子关系,重复递归
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    
   return getReverseList(nil,head)
}
// 确认参数
func getReverseList(pre,head *ListNode)*ListNode{
    // 终止条件
    if head == nil{
        return pre
    }
    // 单层循环
    ne := head.Next

    head.Next = pre

    return getReverseList(head,ne)
}