c++ 链表翻转

博客介绍了快指针和慢指针的使用,快指针指向末尾时退出循环。同时阐述了链表翻转的两种方法,一种是递归方式,另一种是借助临时变量实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快指针和慢指针

ListNode *slow = head;
ListNode *fast = head;
while(fast)
{
	slow = slow->next;
	fast = fast->next ? fast->next->next: fast->next;
}

快指针指向末尾,退出循环

链表翻转(递归)

ListNode* rev(ListNode* h)
{
    if(h==NULL or h->next==NULL)
        return h;
    ListNode *p=rev(h->next);
    h->next->next=h;
    h->next=NULL;
    return p;
}

还有一种借助临时变量

链表翻转(借助临时变量)

 ListNode* reverseList(ListNode* head)
{
	 ListNode *p1,*p2;
	 p1 = head;
	 p2 = NULL;
	 if(p1 == NULL) return head;
	 while(p1 != NULL)
	 {
		ListNode *temp = p1->next;
		p1->next = p2;
		p2 = p1;
		p1 = temp;
	 }
	 return p2;
}
### 单链表反转的实现 在 C++ 中,单链表的反转可以通过调整节点之间的指针方向来完成。以下是基于提供的引用内容以及标准实践的一个完整代码示例: ```cpp #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; // 反转链表的核心函数 ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; // 初始化前驱节点为 null ListNode* curr = head; // 当前节点初始化为头节点 while (curr != nullptr) { // 遍历整个链表直到当前节点为空 ListNode* nextTemp = curr->next; // 保存下一个节点 curr->next = prev; // 修改当前节点的 next 指向前驱节点 prev = curr; // 移动前驱节点到当前位置 curr = nextTemp; // 移动当前节点到下一个位置 } return prev; // 返回新的头节点(即原来的尾节点) } // 打印链表辅助函数 void printList(ListNode* head) { ListNode* temp = head; while (temp != nullptr) { cout << temp->val << " "; temp = temp->next; } cout << endl; } int main() { // 创建一个简单的链表:1 -> 2 -> 3 -> 4 -> 5 ListNode* head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); head->next->next->next = new ListNode(4); head->next->next->next->next = new ListNode(5); cout << "Original list: "; printList(head); // 输出原始链表 ListNode* reversedHead = reverseList(head); // 调用反转函数 cout << "Reversed list: "; printList(reversedHead); // 输出反转后的链表 return 0; } ``` #### 关键点解析 上述代码实现了单链表的就地反转功能[^1]。具体来说: - **`prev` 和 `curr` 的作用**:分别代表前驱节点和当前节点,在遍历时逐步更新它们的关系。 - **临时变量的作用**:为了不丢失后续节点的信息,引入了 `nextTemp` 来存储当前节点的下一跳地址[^2]。 - **边界条件处理**:当输入链表为空时 (`head == nullptr`),直接返回 `nullptr`[^3]。 此方法的时间复杂度为 O(n),空间复杂度为 O(1)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值