c语言链表翻转

明天多益网络一面,晚上写了个简单的链表翻转程序找找感觉,两种思路实现。一种通过头插法实现翻转,另一种则是通过更改节点指针指向来实现。虽然简单,但动动手,活跃下思维!希望明天面试顺利!

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;

Node *CreateLinkList();
void PrintLinkList(Node *h);
void Traverse1(Node *h);
void Traverse2(Node *h);
int main()
{
Node * H = CreateLinkList();
Traverse1(H);
PrintLinkList(H);
Traverse2(H);
PrintLinkList(H);
return 0;
}
void Traverse2(Node *h)
{
Node *start = h->next;
Node *pre = start->next;
Node *cur = pre;
start->next = NULL;
while(pre)
{
pre = pre->next;
cur->next = start;
start = cur;
cur = pre;
}
h->next = start;

}
void Traverse1(Node *h)
{
Node* cur = h->next;
Node *pre = cur->next;
cur->next = NULL;
Node *p = NULL;
while(pre)
{
p = pre;
pre= pre->next;
h->next = p;
p->next = cur;
cur = p ;
}

}
void PrintLinkList(Node *h)
{
Node *list = h->next;
while(list)
{
printf("%d\n",list->data);
list = list->next;
}
}
Node *CreateLinkList()
{
Node *h = (Node *)malloc(sizeof(Node));
h->data = 0;
h->next = NULL;
Node *cur = h;
printf("请依次输入节点数值:(-1结束)\n");
int v;
do
{
scanf("%d",&v);
Node * newNode = (Node *)malloc(sizeof(Node));
newNode->data = v;
cur->next = newNode;
newNode->next = NULL;
cur= newNode;

}while(v != -1);
return h;
}

时间: 2024-10-08 20:50:39

c语言链表翻转的相关文章

C语言-链表

单向链表:结构体非常适合链表结构,链表的组成:head指针.数据块节点指针p->nest.结束指针NULL. 链表操作:需要首先找到表头head指针.链表的操作包括动态链表的创建.顺序输出.删除节点.插入节点的操作. 动态存储操作函数:(ANSI规则返回的指针类型为void*,早期的为字符型指针) 分配一个块:void *malloc(unsigned int size)  //分配成功则返回指向起始地址的指针void * 分配多个块:void *calloc(unsigned n,unsign

20140428 宏定义 单链表翻转 野指针

1.宏定义swap,加括号有什么意义 #define swap(x,y) x = (x)+(y):y=(x)-(y):x=(x)-(y) 加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换,所以如果有以下情况: #define COM(A,B) (A)*(B) 那么COM(6+5,3),它会换成这样: (6+5)*(3) 但是如是去掉了定义中括号,即写成这样: #define COM(A,B) A*B 那么COM(6+5,3),它就会换成这样:6+5*3

将单链表翻转的两种方法

将一个单链表翻转的描述很简单,例如: 输入: NODE1->NODE2->NODE3->NODE4->NODE5->NULL 输出: NODE5->NODE4->NODE3->NODE2->NODE1->NULL 那么,定义单链表如下: (为简单起见,将data字段定义为int, 当然实际应用中data很可能是一个复杂的结构体) typedef struct list_s { int data; struct list_s *next; } li

关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能..但是最近要考试了,所以没有写成菜单的形式..等考试完了,在进行补充吧.. 代码如下... #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,p

Java实现单链表翻转

单链表翻转比如有如下链表: 需要按照C B A 输出,我们可以有好几种方法: package org.andy.test; import java.util.ArrayList; import java.util.List; /** * @author andy * @version:2015-2-4 上午9:41:12 * * */ public class LinkedReverse { /** * @param args */ public static void main(String[

数据结构69:链表逆置,链表反转,链表翻转

链表翻转,简单地理解,就是将链表的头部结点变为链表的尾部结点,与此同时将原链表的尾部结点变成头部结点.如下图所示: 图 1 链表翻转示意图 提示:H 为头指针,图示中的链表无头结点,头指针直接指向首元结点. 将链表进行翻转的方法有多种,本节给大家介绍两种实现方法. 方法一 实现链表翻转最直接的方法就是:从链表的头部开始遍历每个结点,改变每个结点的指向,即将原本指向下一个结点的指针改为指向上一个结点. 唯一比较特殊的是,链表中的首元结点(第一个结点)前面没有结点,所以在改变其指针指向的时候,要将其

链表翻转的图文讲解(递归与迭代两种实现)

链表的翻转是程序员面试中出现频度最高的问题之一,常见的解决方法分为递归和迭代两种.最近在复习的时候,发现网上的资料都只告诉了怎么做,但是根本没有好好介绍两种方法的实现过程与原理.所以我觉得有必要好好的整理一篇博文,来帮忙大家一步步理解其中的实现细节.  我们知道迭代是从前往后依次处理,直到循环到链尾:而递归恰恰相反,首先一直迭代到链尾也就是递归基判断的准则,然后再逐层返回处理到开头.总结来说,链表翻转操作的顺序对于迭代来说是从链头往链尾,而对于递归是从链尾往链头.下面我会用详细的图文来剖析其中实

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域

c语言链表和指针的运用

在学习指针之前,首先要认识指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值.当用在声明一个变量时,*表示这里声明了一个指针.其它情况用到*表示指针的取值.&是地址操作符,用来引用一个内存地址.通过在变量名字前使用&操作符,我们可以得到该变量的内存地址.