C实现之单链表逆置问题

 /*问题描述,如何在时间复杂度为O(n)的前提下,实现单链表翻转。并尽量减少内存消耗。

即1-2-4-5-6转化为6-5-4-2-1。

*/

 1 # include<stdio.h>
 4 struct Slist{
 5
 6     int size;
 7     struct sl* head;
 8
 9
10 };
11 struct sl{
12
13     int k;
14     struct sl* next;
15
16
17 };
18 typedef struct Slist Sl;
19 typedef struct sl sl;
20
21
22 void init(Sl* m,int k){
23
24     sl* p = (sl *)malloc(sizeof(sl));
25     p->k = k;
26     p->next = NULL;
27     m->head =p;
28     m->size = 1;
29     //printf("%x,  %d, %x", m->head,m->size,p);
30 }
31
32 void add(Sl* m,int key ){
33     //printf("%x", m->head);
34     sl* p=(sl *)malloc(sizeof(sl));
35     sl* q = (sl *)malloc(sizeof(sl));
36     p->k = key;
37     p->next = NULL;
38     q = m->head;
39     while (q->next != NULL)
40         q = q->next;
41     q->next = p;
42     m->size++;
43 }
44
45 void FanZhuan(Sl* m){
46
47     sl* p = m->head;
48     sl* q =NULL;
49     sl* r =NULL;
50     while (p->next!=NULL){                     //三指针循环记录转换,单次扫描,修改链表元素指针。
51
52         q = p->next;
53         p->next = r;
54         r = p;
55         p = q;
56     }                                         //此时,最后一个元素的指针还没修改完成。57     q->next = r;
58     m->head = q;                              //链表完成后,记得把链表头修改为原链表尾地址。
59 }
60
61
62 void BianLi(Sl* m){
63
64     sl* a = m->head;
65     printf(" \n");
66     while (a != NULL){
67         printf("%d",a->k);
68         a = a->next;
69     }
70 }
71
72 void main(){
73
74
75     Sl* t = (Sl*)malloc(sizeof(Sl));
76     t->size=0;
77     t->head = NULL;
78     init(t,8);
79     add(t, 3);
80     add(t, 2);
81     add(t, 1);
82     add(t, 0);
83     printf("\n The new list:\n");
84     BianLi(t);
85     FanZhuan(t);
86     printf("\ nThe list turned:\n");
87     BianLi(t);
88     system("pause");
89 }
时间: 2024-10-13 12:48:14

C实现之单链表逆置问题的相关文章

单链表逆置

重写单链表逆置,熟能生巧- #include <iostream> #include <cstdlib> using namespace std; typedef struct List{ int num; struct List *next; }ListNode,*pListNode; void display(ListNode *pHead) { while(pHead) { cout<<pHead->num<<"--"; pH

03 单链表逆置

单链表逆置 方法: <1>断开第一个数据节点和第二个数据节点的链接 <2>将后面的节点通过头插法的思想插在头节点后面 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 // 数据结构 6 typedef struct node 7 { 8 int data; 9 struct node *next; 10 }linkList; 11 12 // 创建单链表,并

单链表逆置Java

package com.kpp; /** * 单链表逆置 * 将单链表从第一个结点和第二个节点之间断开,然后将第2,3...个结点依次插入第一个结点之前 * @author kpp * */ class LNode{ private String data; private LNode next; } public class LinkedListReverse { private static void reverse(LNode head){ if(head == null||head.ne

C语言单链表逆置的代码实现 (简单易懂版)

嗯,,这是自己写的第一篇博客哈,写的不好大家不要见怪,主要是想把自己的一些思想分享给大家.也欢迎大家指出错误,一同进步. 话不多说,直接先说想法.要把一个单链表逆置,可以大致分为下列几步.先创建一个链表.然后要考虑到链表的逆置实现.最后是链表的输出.有了这样过几步大概的想法之后,我们便要来一步步的实现啦.嗯,,创建链表就不说了,大家都会.  然后呢就是链表的逆置,这里我是采用的就地逆置法,,嗯,反正我是这么叫的,大家可以参考一下.当然啦,你得考虑到函数的形参和返回值以及指针的交接,这里如果出了问

java实现单链表逆置

1 class LNode 2 { 3 public LNode next; 4 public int data; 5 } 6 /*逆置链表*/ 7 class Nizhi 8 { 9 private static LNode head = new LNode();; 10 private static LNode node; 11 private static LNode tail; 12 private static int index; 13 private static LNode ne

对于&quot;单链表逆置和递归&quot;的问题的理解.

一. 相关知识要点: 学习或了解基础数据结构和C语言, 对基础链表知识或相关知识有概况性认识. 例如: 本题目结构为: 1 #define elem_type int 2 3 typedef struct _single_list { 4 elem_type data; //所存的数据元素 5 _single_list *next; //所存的指针元素 6 }ListNode; 二. 问题的思考过程(本题以3种不同的方法解决): <1>类似于我们学习的C语言基础知识中的冒泡排序(参考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,

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)

本文主要内容 1)介绍c++中双向链表的写法. 2)实现双向链表中数据的增.删.查.改.链表逆置.链表输出 3)介绍类中构造函数.析构函数.运算符重载函数的写法 接下来介绍双向链表的成员函数:这写函数放在头文件中,方便编写 #pragma once #include<iostream> using namespace std; #include<assert.h> typedef int DataType; class ListNode  //节点 { public: ListNo

链表——逆置

给定程序中,函数fun的功能是将带头结点的单向链表逆置,即若原链表中从头至尾结点数据与依次为2.4.6.8.10,逆置后,从头至尾结点数据依次为10.8.6.4.2. 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果. 试题程序. 1 #define N 5 2 typedef struct node 3 { 4 int data; 5 struct node *next; 6 } NODE; 7 void fun(NODE *h) 8 { 9 NODE *p, *q, *r