题目来源:力扣-206. 反转链表
题目描述: 给定单链表的头节点 head
,请反转链表,并返回反转后的链表的头节点。
方法:双指针法
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
先看代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if (!head) {
return NULL; // 如果链表为空,则返回空指针
}
struct ListNode* pre = NULL; // pre指向链表末尾
struct ListNode* cur = head; // cur指向链表的头节点
while (cur) {
struct ListNode* temp = cur->next; // 保存下一个节点
cur->next = pre; // 反转当前指针,cur指向pre
pre = cur; // 移动pre到当前节点
cur = temp; // 移动cur到下一个结点
}
return pre; // pre现在变成了新的头节点
}
整体思路: 通过迭代链表,逐个调整节点的next
指针来实现逆序。在每次迭代中,它都会保存当前节点的下一个节点(temp
),然后将当前节点的next
指针指向前一个节点(pre
),接着更新pre
和cur
指针以继续处理链表的剩余部分。最终,pre
指针将指向新的头节点(原链表的尾节点),因为原头节点(head
)的next
指针现在将指向NULL
(链表末尾)。
更多内容持续输出中……