c语言链表逆序的问题

去面试被问到一个问题,怎么把一个链表反转(用原链表),自己在网上找了到了一篇文章,http://blog.csdn.net/sicofield/article/details/8850269,原作者给出了三种方法,

方法一:将链表数据全部读到数组中,然后在倒序输出。

方法二:就是我下面要讲的。

方法三:从第二个结点开始,把之后的每个结点都插入到第一个结点之后,最后在把第一个结点挪到表尾。

第二种方法的思路是:从第二个结点开始,记录它的下个结点,把它挪到第一个结点之前,成为新表头,然后下个结点继续这个过程。

 1 struct stu *reserve(struct stu *head)
 2 {
 3         struct stu *p1,*p2,*p3;    
 4         p1=head;
 5         p2=p1->next;            // 这个结点为要移动的结点
 6         while(p2)
 7         {
 8                 p3=p2->next;       //记录的为要移动的结点的下一个结点
 9                 p2->next=p1;       //移动结点到最前
10                 p1=p2;          //移动的结点变为新表头
11                 p2=p3;          //下个结点变为要移动的结点
12         }
13         head->next=NULL;        //移动完毕后head变为表尾,让它指向为空
14         head=p1;             
15         return head;
16 }

方法三的贴下原作者的代码加上自己的思路:

 1 struct stu *reserve(struct stu *head)
 2 {
 3         struct stu *p,*q;
 4         p=head->next;                           //记录第二个结点
 5         while(p->next!=NULL)
 6         {
 7                 q=p->next;                      //记录要移动的结点
 8                 p->next=q->next;                //把该结点从原链表中移除
 9                 q->next=head->next;             //把该结点连接到head之后
10                 head->next=q;
11         }
12         p->next=head;                           //把head移动到新表尾,此时链表成环
13         head=p->next->next;                     //找到移动完之后的新head
14         p->next->next=NULL;                     //断开环
15         return head;
16
17 }
时间: 2024-08-06 03:05:08

c语言链表逆序的问题的相关文章

华为机试题-- 单链表逆序

[问题] 单链表逆序 [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNode { int value; struct ListNode *next; }ListNode; typedef struct ListNode *List; List reverseList(List head) //列表逆序 { ListNode *rear, *curr,

[2013] 链表逆序

题目二:逆序链表输出. 题目描述:   将输入的一个单向链表,逆序后输出链表中的值.链表定义如下: typedef struct tagListNode  {        int value;        struct tagListNode *next;  }ListNode;   要求实现函数:   void converse(ListNode **head); [输入]head:    链表头节点,空间已经开辟好 [输出]head:    逆序后的链表头节点 [返回]无 [注意]只需要

单链表逆序或者逆序输出

分为两种情况,一种是只逆序输出,实际上不逆序:另一种是把链表逆序. ********************逆序输出*********************** 1 #include<iostream> 2 #include<stack> 3 #include<assert.h> 4 using namespace std; 5 6 7 typedef struct node{ 8 int data; 9 node * next; 10 }node; 11 12 //

链表逆序 和 寻找链表中间节点

已知链表的头节点为head,写一个函数把链表逆序. void reserve(list_node* head){ if(head == NULL) return 0; list_node* p = head; list_node* q = p->next; list_node* r = NULL; while(q){ r = q->next; q->next = p; p = q; q = r; } head->next == NULL; head = p; } 找出单链表的中间节

链表逆序+判断链表是否回文

单链表逆序详解 1.具有链表头的单链表 假设需要逆序的单链表为: 则逆序以后的链表为: 过程: (1)取p1指向header->next (p1=stu->next);p2保留p1->next(p2=p1->next);将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点 p1->next=NULL; (2)取p3保留p2->next (p3=p2->next);将p2插入p1之前(p2->next = p1);p1指向p2指向的

[链表常用技巧]链表逆序+链表中点

链表逆序 给定一个链表,一般的逆序的方法要设置三个指针,这种操作很繁琐,下面总结一种简单的方法: 为链表设置一个头结点,然后head后面的节点依次的插入到head结点之前.最后完成链表的逆序. 代码实现: ListNode* reverseList(ListNode* head) { if(head == NULL) return NULL; ListNode dummy(-1); dummy.next = head; ListNode *pre = dummy.next; while(pre-

链表逆序输出 ---九度1511

题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出: 5 4 3 2 1 解题思路: 方法一:直接用数组存储数据,然后反向输出,不过好像通不过.为什么? 方法二:利用

链表 - 单链表逆序

单链表逆序是经典的链表操作算法,单链表逆序的算法思想是将链表箭头反指(假设next指针是一个箭头),即所谓的改链,改链过程如下. 逆序前: head-->......prev-->cur-->next-->......->NULL 逆序后: NULL<--......prev<--cur<--next<--......head 算法逻辑: 1.空链表或只有一个元素,返回原链表head. 2.定义3个指针prev.cur.next,初始化时,prev指向

编程算法 - 链表逆序 代码(C)

链表逆序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 链表逆序, 作为链表操作的基础必须要熟练手写. 主要包含3个部分, 一个指针记录后面节点, 一个指针记录前面节点, 把当前节点指到前面节点, 移动到后面节点, 前后指针依次移动. 非递归链表逆序算法的核心代码只有10行. 代码: /* * main.cpp * * Created on: 2014.9.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.