反转链表(力扣206)

文章提供了两种反转单链表的方法。方法一是通过迭代,使用三个指针n1,n2,n3来辅助反转链表。方法二是递归实现,通过不断反转子链表并将结果连接起来,最终达到反转整个链表的目的。两种方法都改变了链表中节点的next指针,使其指向前一个节点。

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

此题需要学过数据结构单链表的基础才能看懂大概,废话不多说上题目。

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

例1:

 例如:

输入:head={1 ,2 ,3 ,4 ,5 }

输出:head={5,4,3,2,1}

如图一

 如图二

 如图三

 上代码:(方法一)

struct ListNode* reverseList(struct ListNode* head) 
{
	if (!head||!head->next)//判断head或者head->next是否为空指针
		return head;

	struct ListNode* n1 = NULL, * n2 = head, * n3 = head->next;
	//设计三个变量,n1指向head前面的空间,n2指向的是head空间,n3指向的是head->next

	while(n2 != NULL)
	{
		//将1->NULL,将2->1,将3->2最后形成5->4->3->2->1->NULL
		n2->next = n1;
		//向后移位
		n1 = n2;
		n2 = n3;
		if(n3!=NULL)
		//当出现图三情况时,NULL指针不能指向下一位next
		n3 = n3->next;
	}

	return n1;//最后n1指向最后一位(非NULL),n2=n3=NULL
}

上代码:(方法二)

struct ListNode* reverseList(struct ListNode* head) 
{
    if (!head|| !head->next) 
        return head;

    struct ListNode* newHead = reverseList(head->next);
    //一直递归到head->val==5才停止
    //当返回递归时head->val==4,3,2,1一直递减到head(开始)

    head->next->next = head;
    //相当于把1->2->3->4<->5->NULL
    //后面也就回形成
    // 1->2->3<->4<-5
    //1->2<->3<-4<-5
    //1<->2<-3<-4<-5

    head->next = NULL;
    //把4<->5变成4<-5
    //将一方的转向变为NULL,也就不会出现双方指向双方的情况

    return newHead;
   //当递归返回到最后时newHead->val==1的位置
}

无论方法一还是二,都是让指针的next指向反方向,方法一为防止n2指向n1后丢失n2后面的地址,使用设计出n3来记录n2->next,防止找不回导致下一步无法实施

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值