首页 > 其他分享 >反转单向链表 | 空间复杂度O(1)

反转单向链表 | 空间复杂度O(1)

时间:2023-07-31 18:36:03浏览次数:34  
标签:NULL curr 指向 复杂度 单向 next 链表 prev

反转单向链表

时间复杂度:O(N)

空间复杂度:O(1)

void reverse_list (node** head_ptr) {
	node* prev = NULL;
	node* curr = *head_ptr;
	node* next = NULL;
    
	while (curr != NULL) {
		/* INSERT CODE HERE */
		next = curr->next;
		curr->next = prev;

		prev = curr;
		curr = next;
	}

	/* Set the new head to be what originally was the last node in the list */
	*head_ptr = prev;
}

a -> b -> c -> ... -> end

第一次循环:

curr指向a,next指向b,curr->next 指向NULL(prev)。此时没有节点指向b,但next记录了b,所以curr可以通过next变量指向b。在此之前,将prev更新为a。

第二次循环:

初始curr指向b,prev指向a;更新next指向c,curr->next(即b->next)指向prev(a)。此时的链表变成两部分:一部分是NULL <- a <- b; 另一部分是c -> ... -> end.

直到最后一次循环结束时,prev指向end,curr(以及next)指向NULL。

循环结束,此时只剩下一条链表: NULL <- a <- b <- ... <- end.

改变初始头节点为prev(end),即完成链表反转。

标签:NULL,curr,指向,复杂度,单向,next,链表,prev
From: https://www.cnblogs.com/C111111/p/17594184.html

相关文章

  • 143. 重排链表
    143.重排链表  给定一个单链表L的头节点head,单链表L表示为:请将其重新排列后变为:不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例1:输入:head=[1,2,3,4]输出:[1,4,2,3]示例2:输入:head=[1,2,3,4,5]输出:[1,5,2,4,3] 提示:链......
  • 代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面
    两两交换链表中的节点(力扣24.)dummyhead.next=head;cur=dummyhead;while(cur.next!=null&&cur.next.next!=null)temp=cur.next;temp1=cur.next.next.next;cur.next=cur.next.next;cur.next.next=temp;temp.next=temp1;cur=cur.next.next;returndummyhead.n......
  • 【ACM专项练习#02】整行字符串、输入vector、打印图形、处理n组数据以及链表操作等
    输入整行字符串平均绩点题目描述每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。输入有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。输出每组输出结果占一行。如果输入的大......
  • 代码随想录算法训练营第四天| LeetCode 24. 两两交换链表中的节点 19.删除链表的倒
    24.两两交换链表中的节点     卡哥建议:用虚拟头结点,这样会方便很多。 本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%......
  • 力扣---142. 环形链表 II
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果......
  • 链表之差的绝对值
    假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个非负整数。给定两个这种链表,请生成代表两个整数之差绝对值结果链表。链表长度最大值为10000,链表任意值0≤val<9要求:空间复杂度O(n),时间复杂度O(n)例如:链表1为9->3->7,链表2为9->6->3,最后生成新的结果链表为2-~>......
  • 代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转
    链表定义:通过指针串联在一起的线性结构,每一个节点由两个部分组成:数据域和指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null,即为空指针。链表类型1.单链表2.双链表3.循环链表,即链表首尾相连,可以解决约瑟夫环问题链表的存储方式数组在内存中是连续分布的,......
  • 反转链表
    title:反转链表date:2023-07-3009:25:12tags:-c/c++categories:-算法-笔试top:反转链表题目来自acwing题目(点击跳转)定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思考题:请同时实现迭代版本和递归版本。数据范围链表长度[0,30]......
  • go 链表栈
    packagemainimport"fmt"//链表栈typeLinkStackstruct{root*LinkNode//栈顶sizeint//栈的元素数量}//栈中的结点typeLinkNodestruct{dataintnext*LinkNode}funcNewLinkStack()*LinkStack{return&LinkStack{root:nil,size:0}}//入栈func(link......
  • [代码随想录]Day04-链表part02
    题目:24.两两交换链表中的节点思路:首先给他加一个虚拟头结点,然后思考反转的逻辑,这是每两个为一组,比如1,2是一组、3,4是一组,如果说1,2一组2,3一组就变成了链表的逆转了。那么指针的逻辑是:两个指针一个r指向要交换的二元组的第一个节点一个l指向前一个节点二元组的第二个节......