标签:循环、递归
思路
断键再重新组合键的过程
循环
- 记录父节点和子节点,子节点不断遍历寻找下一个值,遍历过程中进行翻转
func reverseList(head *ListNode) *ListNode {
var pre *ListNode // 记录父节点
for head != nil{
// 遍历下一个节点
ne := head.Next
// 断键重组
head.Next = pre
// 循环重新赋值
pre = head
head = ne
}
return pre
}
递归
三部曲:
- 确定传参以及返回值
- 传参:重新组合需要父节点和子节点重新组合,所以需要pre、head两个节点
- 返回值:重新组合后直接返回反转后的链表
- 确定终止条件
- 当子节点为空节点的时候,返回父节点
- 确定单层循环
- 翻转父子关系,重复递归
/**
* 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)
}