题目描述:206. 反转链表 - 力扣(LeetCode)
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
方法一:
解题思路:
- 用一个指针 move 用来遍历原始链表,在用另一个指针newhead作为新链表的头节点;
- 用 move 指向的节点作为新链表进行头插的新节点,向后移动 move;
- 重复步骤二,直到 move 遍历原始链表的所有节点;
- 返回新链表的头节点。
代码:
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* move = head, * newHead = NULL;
while(move != NULL)
{
// 进行头插
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = move->val;
newNode->next = NULL;
newNode->next = newHead;
newHead = newNode;
move = move->next;
}
return newHead;
}
分析:
该方法的空间复杂度是O(N),时间复杂度是O(N)。
方法二:
解题思路:
翻转链表,我们只需要将原先的由 左面一个节点指向右面一个节点 变成 右面一个节点指向左面一个节点,最后将链表的最后一个节点作为翻转后链表的头节点返回即可。由于节点的指针域发生改变后,就不能找到下一个节点的位置了,所以我们要提前将下一个节点的位置保存下来在改变节点的指针域。
- 用三个指针n1,n2,n3 分别指向NULL、头节点、头结点的下一个节点;
- 改变指针域:n2->next = n1;保存下一个节点的位置: n1 = n2; n2 = n3; n3 = n3->next.
- 重复步骤二,直到 n2 等于NULL;
- 返回 n1。
代码:
struct ListNode* reverseList(struct ListNode* head)
{
if (head == NULL)
return NULL;
struct ListNode* n1 = NULL;
struct ListNode* n2 = head;
struct ListNode* n3 = head->next;
while (n2 != NULL)
{
n2->next = n1;
n1 = n2;
n2 = n3;
if (n3 != NULL)
{
n3 = n3->next;
}
}
return n1;
}
需要注意的是,当最后一次 n2 移动到 n3 的位置时(NULL),此时 n3 已经是NULL了,所以 n3 不能再向后移动了。
分析:
该方法的空间复杂度是O(1),时间复杂度是O(N)。
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……