数据结构c语言中单链表就地逆置问题

法一:

list_node *list_reverse(list_node *head)

  • {
  • list_node *p = head->next;
  • list_node *q = NULL;
  • head->next = NULL;
  • while(p != NULL)
  • {
  • q = p->next;          /*保存下一个节点*/
  • p->next = head->next; /*把节点插入到头结点后面*/
  • head->next = p;       /*头结点一直指向最新插入的节点*/
  • p = q;                /*调整指针,指向下一个节点*/
  • }
  • }

法二

void reverse(struct node *head)

{
struct node *p,*s,*t;
p = head;
s = p->next;
while(s->next != NULL)

{                         //主要置换过程
t = s->next;        // t为临时变量
s->next = p;       // 实施反转
p = s;                 // p向前移动一个结点,为转换下一个结点做准备
s = t;                 // 恢复s指针,以便处理下一个结点
}                        // 此时s->next == NULL,循环结束
s->next = p;      // 翻转最后一个结点
head->next->next = NULL;   // head的next指向的结点是原链表的第一个数据结点
head->next = s;   // 现在s是新的第一个数据结点
}

时间: 2024-10-29 19:08:35

数据结构c语言中单链表就地逆置问题的相关文章

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

链表操作,单链表就地逆置 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; /*将

单链表就地逆置

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

数据结构之 线性表--链表的逆置

数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据. 输入 输入多个整数,以-1作为结束标志. 输出 输出逆置后的单链表数据. 示例输入 12 56 4 6 55 15 33 62 -1 示例输出 62 33 15 55 6 4 56 12 #include <iostream> #include <

单链表就地逆置(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)

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

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

数据结构c语言中单链表删除最小值节点

一: LinkList Delete_Min(LinkList &L){    //L是带头结点的单链表,本算法删除其最小值结点    LNode *pre = L, *p=pre->next;  //p 为工作指针,pre 指向其前驱    LNode *minpre=pre, *minp=p;  //保存最小值结点及其前驱    while(p!=NULL){        if(p->data<minp->data){            minp=p;  //找到

单链表的就地逆置问题

问题描述:编写一个单链表的成员函数,实现对带头结点的单链表的就地逆置操作 涉及变量:position:Node型变量,用于存放尚未反转的结点中首结点的位置 temp:用于标记执行反转操作的结点 涉及教材:<数据结构--Java语言描述(第2版)> 清华大学出版社 大致思路: 将头结点的指针域设为空,再将原来的结点从首结点开始依次连接在头结点之后,即可将原来位置倒置 代码如下: 以上是我对单链表就地逆置的一些理解,希望对各位有所帮助 190116 Rewivy 原文地址:https://www.

数据结构实验之链表三:链表的逆置

数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据. 输入 输入多个整数,以-1作为结束标志. 输出 输出逆置后的单链表数据. 示例输入 12 56 4 6 55 15 33 62 -1 示例输出 62 33 15 55 6 4 56 12 提示 不得使用数组. 来源 示例程序 /*************