首页 > 其他分享 >反转单向链表

反转单向链表

时间:2023-08-08 10:44:06浏览次数:40  
标签: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) {
		next = curr->next;
		curr->next = prev;

		prev = curr;
		curr = next;
	}

	*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/17613565.html

相关文章

  • 02手写链表
    一、简介手写链表实现以下功能尾插获取指定下标的元素按照指定位置插入元素打印链表内容删除指定元素释放整个链表链表反转链表中相邻元素的和最大的两个元素的第一个节点,且返回和的最大值二、源代码LinkedList.h#ifndef_LINKEDLIST_H#define_LINKEDLIST_H#inc......
  • python对单双链表进行操作
    `classLinkNode:definit(self,val=0,next=None):#定义指针指向节点的数值self.val=val#定义指针self.next=NoneclassMyLinkedList:definit(self):self.head=LinkNode(0)self.size=0#获取链表中下标为index的值,如果下标无效,则返回-1defget(self,index:i......
  • 24. 两两交换链表中的节点 【递归】
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。输入:head=[1,2,3,4]输出:[2,1,4,3] 思路:递归fromtypingimportOptional#创建链表defcreate_linked_list(lst):ifnotlst:......
  • 数据结构与算法(四):双向链表
    基本概念双向链表概念和单向链表是一致的,区别在于双向链表在单向链表的基础上,指针区域多了一个指向上一个节点的指针。单向链表内容可以参考我的上一篇文章:http://t.csdn.cn/Iu56H。基本的数据结构如图所示:链表结构双向链表结构包含了节点的数据内容和两个指针:指向前一个节点......
  • 代码随想录算法训练营第七天|力扣334.反转字符串、力扣541.反转字符串II、剑指offer05
    字符串反转字符串(力扣344.)如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。毕竟面试官一定不是考察你对库函数的熟悉程度,如果使用python和java的同学更需要注意这一点,因为python、java提供的库函数十分丰富。如果库函数仅仅是解题过程中的一小部分,并且......
  • 力扣-24. 两两交换链表中的节点
     题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 =publicstaticListNodeswapPairs(ListNodehead){if(head==null||head.next==null)returnhead;......
  • 【ACM专项练习#03】打印图形、栈的合法性、链表操作、dp实例
    运营商活动题目描述小明每天的话费是1元,运营商做活动,手机每充值K元就可以获赠1元,一开始小明充值M元,问最多可以用多少天?注意赠送的话费也可以参与到奖励规则中输入输入包括多个测试实例。每个测试实例包括2个整数M,K(2<=k<=M<=1000)。M=0,K=0代表输入结束。输出对于每个测试实......
  • 王道408用数组,链表以及双向链表实现栈、队列
    我在电脑上敲了一遍,又在纸上模拟了一遍下面记录在电脑上敲的:一、用数组实现栈#include<stdio.h>#include<string.h>#defineMaxSize50typedefstruct{intdata[MaxSize];inttop;}stack;voidInitStack(stack&S){S.top=-1;S.data[0]=5;......
  • LeetCode 206 反转链表,LeetCode 92反转链表Ⅱ
    反转链表给你单链表的头节点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写法一:不使用头节点,......
  • 洛谷 P1553 数字反转(升级版)
    题目描述给定一个数,请将该数各个位上数字反转得到一个新数。整数反转是将所有数位对调。小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。百分数的分子一定是整数,百分数只改变数字......