单链表的逆置--普通循环方法(详细图解)

关于单链表的逆置,大家都很清楚有两种基本方法:(1)普通的循环的方法。(2)递归调用方法。今天正好研究这两种方法,发现很不理解代码这么写的具体的作用,诚如很多人所说,吃透这个还是要自己画一个详细的过程图。今天就给大家介绍一下(普通的循环方法)我学习下来的一些经验,如有不对之处还望大家一起交流。

首先,以下是关于单链表逆置的普通循环方法的代码:

//单链表定义
typedef struct ListNode{
		int m_nValue;
		ListNode* pNext;
};

//单链表逆置实现
ListNode* ReverseList(ListNode* pHead)
{
	if (pHead == NULL || pHead->pNext == NULL)
	{
		retrun pHead;
	}

	ListNode* pRev = NULL;
	ListNode* pCur = pHead;
	while(pCur != NULL)
	{
		ListNode* pTemp = pCur;   // 步骤①
		pCur = pCur->pNext;       // 步骤②
		pTemp->pNext = pRev;      // 步骤③
		pRev = pTemp;
	}
	return pRev;
}

  

下面我们来用图解的方法具体介绍整个代码的实现流程:

初始状态:

第一次循环:

第一次循环过后,步骤①:pTemp指向Head,步骤②:pCur指向P1,步骤③:pTemp->pNext指向NULL。

此时得到的pRev为:

第二次循环:

第二次循环过后,步骤①:pTemp指向P1,步骤②:pCur指向P2,步骤③:pTemp->pNext指向Head。

此时得到的pRev为:

第三次循环:

第三次循环过后:步骤①:pTemp指向P2,步骤②:pCur指向P3,步骤③:pTemp->pNext指向P1。

此时得到的pRev为:

第四次循环:

第四次循环过后:步骤①:pTemp指向P3,步骤②:pCur指向NULL,步骤③:pTemp->pNext指向P2。

此时得到的pRev为:

至此,单链表的逆置完成。

时间: 2024-10-07 02:56:25

单链表的逆置--普通循环方法(详细图解)的相关文章

(转)单链表的逆置

对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点.这样依次编译的过程中只需修改其后继结点的next域即可. 实现代码: 1 typedef int DataType; //类型定义 2 typedef struct node{ //单链表定义 3 DataType data; 4 struct node* next; 5 }LinkedNode,*LinkList; 6 void ReverseList(LinkList&

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g

单链表就地逆置

题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为O(1). 解题思路: 如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换. 如果不要求"就地"的话,可以创建一个n个元素辅

C语言:【单链表】逆置反转单链表

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next; }SListNode; SListNode* BuyNode(DataType x) {     SListNode* next = (SListNode*)malloc

单链表就地逆置(Java版)

题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为O(1). 解题思路: 如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换. 如果不要求"就地"的话,可以创建一个n个元素辅

【数据结构课程作业】单链表就地逆置

#include <stdio.h> #include <stdlib.h> typedef struct List { int val; struct List *next; }List; void InitList(List **h, List **t) { *h = (List *)malloc(sizeof(List));//*h就是头指针的地址 *t = (List *)malloc(sizeof(List));//*t就是尾指针的地址 if(!(*h) || !(*t)

单链表的逆置(不带头结点)

#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }Node; Node *Initiate(Node *linklist) { linklist=NULL; return linklist; } Node* creatlist_end(Node *linklist)//尾插法 { int i,n; Node *p,*q; scanf("%d&

数据结构与算法-链表就地逆置

链表操作,单链表就地逆置 void Inverse(LinkList &L) { LNode *p, *q; p = L->next; /*记录第一个结点地址*/ L->next = NULL; /*把链表设置成空表*/ while (p != NULL) /*依次按头插法将各结点插入,就实现了逆置*/ { q = p; /*用q记录待插入结点地址*/ p = p->next; /*用p记录待插入结点的后继结点地址*/*/ q->next = L->next; /*将

如何在时间复杂度为O(n)空间复杂度为O(1)的情况下完成链表的逆置

问题如题目,首先分析,链表的反转的空间复杂度如果为常数级,那么不可能完成从堆中申请数据来完成链表的反转工作,所以问题就转化为了如何将原链表修改/拆解为逆置的链表: 函数形式假定如下  void Inverse(List*&head)//////修改原链表为逆置 第一种办法最简单,就是在创建一个局部变量 List*tail 作为产生的新链表的“尾部”,再设置一个“游标”指针用于指向当前正在访问的链表单元,然后按顺序循环遍历链表,在遍历的同时将正在访问的链表单元添加到新链表尾部的“tail”指针前面