力扣题目学习笔记(OC + Swift)206. 反转链表
2023-12-29 17:32:50
206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例
方法一、迭代
在遍历链表时,将当前节点的 next\textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
复杂度分析
时间复杂度:O(n),其中 nnn 是链表的长度。需要遍历链表一次。
空间复杂度:O(1)。
Swift
//迭代法
func reverseList(_ head: ListNode?) -> ListNode? {
var previ: ListNode?
var cur = head
while cur != nil {
let nex = cur?.next
cur?.next = previ
previ = cur
cur = nex
}
return previ
}
OC
//迭代
-(ListNodeOC *)reverseList:(ListNodeOC *)head {
ListNodeOC *pre = nil;
ListNodeOC *cur = head;
while (cur != nil) {
ListNodeOC *nex = cur.next;
cur.next = pre;
pre = cur;
cur = nex;
}
return pre;
}
方法二、递归
递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?
比较抽象,直观理解是把head和除head之外的部分看成两个部分,head已不需要翻转,另一部分需要调用自己继续完成翻转,最后重新组织前后依赖关系,注意新链表的尾部节点的next为空,否则会引入循环。
复杂度分析
时间复杂度:O(n),其中 nnn 是链表的长度。需要遍历链表一次。
空间复杂度:O(n)。
Swift
func reverseList(_ head: ListNode?) -> ListNode? {
// 递归终止条件
if head == nil || head?.next == nil {
return head
}
let next = head?.next
let node = reverseList(next)
head?.next = nil
next?.next = head
return node
}
OC
-(ListNodeOC *)reverseList:(ListNodeOC *)head {
//递归终止条件
if (!head || !head.next) {
return head;
}
ListNodeOC *next = head.next;
ListNodeOC *node = [self reverseList:next];
head.next = nil;
next.next = head;
return node;
}
文章来源:https://blog.csdn.net/zzl819954692/article/details/135291155
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!