206. 反转链表
2023-12-14 06:01:42
题目描述
反转一个单链表。
解题思路
使用迭代或递归的方式来反转链表。
解题步骤
迭代方法:
- 初始化三个指针:
prev
(前一个节点)、curr
(当前节点)、next
(下一个节点)。 - 遍历链表,每次将当前节点的
next
指向前一个节点,然后更新prev
、curr
、next
的位置。 - 当
curr
到达链表末尾时,返回新的头节点。
递归方法:
- 使用递归反转链表,递归的终止条件是当前节点为
null
或者next
节点为null
。 - 在递归过程中,将当前节点的
next
指向前一个节点,然后返回新的头节点。
C#代码实现(迭代方法)
public ListNode ReverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
C代码实现(迭代方法)
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* prev = NULL;
struct ListNode* curr = head;
while (curr != NULL) {
struct ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
C#代码实现(递归方法)
public ListNode ReverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = ReverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
C代码实现(递归方法)
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
时间复杂度和空间复杂度
- 时间复杂度:O(n),其中 n 是链表的长度。每个节点最多被访问一次。
- 空间复杂度:O(1)。除了常数级别的变量,算法的空间复杂度是常数级别的。
文章来源:https://blog.csdn.net/Ammmmmmmmn/article/details/134907934
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!