算法思路——迭代
构建一个虚拟头节点pre,使其指向头节点,遍历链表时,将当前节点cur的下一个节点记为tem,第一步将cur的指针指向tem的指向节点,第二步tem的指针指向头节点(即pre的下一个节点),最后一步更新虚拟头节点的指向,使其指向tem节点,第一轮迭代完成,更新tem为cur的下一个节点,第二轮迭代开始,直至完成反转
时间复杂度O(n),空间复杂度O(1)
流程图
代码
type ListNode struct {
Val int
Next *ListNode
}
func reverseList(head *ListNode) *ListNode {
pre := &ListNode{Next: head}
cur := head
for cur != nil && cur.Next != nil {
tem := cur.Next
cur.Next = tem.Next
tem.Next = pre.Next
pre.Next = tem
}
return pre.Next
}