单链表就地反转

  实现一个函数:void reverse(struct list_node *head)在尽量不借助辅助变量的情况下,实现任意长度单链表(不考虑内存限制)的反转(or 逆序)。

struct list_node{
    int val;
    struct list_node *next;
};

struct list{
    struct list_node *head;
    struct list_node *tail;
};

void reverse(struct list_node *head)
{

}
int main()
{
    struct list list = {NULL, NULL};
    struct list_node *p = NULL;
    /*init list*/
    /*打印反转前各节点的值*/
    reverse(list.head);
    p = list.head;
    list.head = list.tail;
    list.tail = p;
    /*打印反转后各节点的值*/
}

代码实现:

#include <stdio.h>

struct list_node{
    int index;
    struct list_node *next;
};
struct list
{
    struct list_node *head;
    struct list_node *tail;
};
void reverse(struct list_node *head)
{
    if(NULL == head|| NULL == head->next )
        return;
    reverse(head->next);
    head->next->next = head;
    head->next = NULL;
}
int main()
{
    int i = 0;
    struct list list = {NULL, NULL};
    struct list_node node[10] = {0};
    struct list_node *p;
    for(i = 0; i < 9; i++)
    {
        node[i].index = i;
        node[i].next = &node[i + 1];
    }
    node[9].index = 9;
    list.head = node;
    list.tail = node + 9;

    reverse(list.head);
    for(p = list.tail; p; p=p->next)
    {
        printf("%d \n",p->index);
    }
        return 0;
}    
时间: 2024-08-30 20:06:58

单链表就地反转的相关文章

单链表的若干问题

(1).试编写算法将带头结点单链表就地逆置,所谓"就地"是指辅助空间为O(1) [解析] 此问题有两种解法. a 把头节点摘下来,然后用头插法建链表就形成所谓的就地逆置 b 依次遍历将指针反转,不过最后一个节点需要注意一下 两算法时间复杂度都是O(n),空间都是O(1) [算法] 第一种算法: //就地反转 int LinkListRerverse(LinkList *head){ LinkList *q,*p; p = head->next; head->next = N

单链表相关算法

[1]打印单链表,void PrintList(List list); 使用一个指针遍历所有链表节点. [2]两个升序链表,打印tarList中的相应元素,这些元素的序号由SeqList指 定,void PrintLots(List tarList, List seqList); 使用两个指针分别遍历两个链表,每次取出序列链表的一个序号后,根据该 序号,到达目标链表指定节点. [3]两个升序链表交集 ,List Intersect(List l1, List l2); [4]两个升序链表并集 ,

单链表的建立、排序和翻转

链表: 1.注意是否有带头结点. 2.单链表的建立:顺序建表(尾插法).逆序建表(头插法). 3.单链表的插入.删除操作需要寻找前驱结点. 单链表的建立.排序和翻转,都是针对有头结点的单链表. #include <iostream> using namespace std; typedef struct Node { int data; Node * next; }Node,*List; //顺序建表:尾插法 void CreateLinkList(List& L, int n) {

数据结构的C++实现之线性表之链式存储结构以及单链表反转

为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一 个指示其直接后继的信息(即直接后继的存储位置).这两部分信息组成数据元素ai的存储映像,称为结点(Node).N个 结点链结成一个链表,即为线性表(a1,a2,...,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫 做单链表. 我们把链表中的第一个结点的存储位置叫做头指针,,为了更方便地对链表进行操作,如删除第一个结 点的特殊情况(第一个结点没有前驱,而要摘除一

Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

Reverse反转算法 1 #include <iostream> 2 3 using namespace std; 4 //交换的函数 5 void replaced(int &a,int &b){ 6 int t = a; 7 a = b; 8 b = t; 9 } 10 //反转 11 void reversed(int a[],int length){ 12 int left = 0; 13 int right = length - 1; 14 while (left

c++-C++ PAT数据结构基础02-1题 反转单链表

问题描述 C++ PAT数据结构基础02-1题 反转单链表 题目大意:反转单链表,给定常数K和单链表L,要求按每K个节点反转单链表,如:L: 1->2->3->4->5->6 K=3,输出:3->2->1->6->5->4,如果K=4,输出:4->3->2->1->5->6. 输入说明:每次输入一个案例,对每个案例,第一行内容是链表第一个节点的地址,节点数N(N<=100,000)(不一定是最终形成的单链表的节

反转单链表的几种方法

最近试着做一些笔试面试题,既是为来年找工作做准备,也可以做为数据结构和算法的复习笔记,就陆续发在这里吧,有需要的朋友可以看一下,如果有没考虑周全的地方欢迎指正. 先来一个最常见的题目:反转单链表.假设单链表的数据结构定义如下: typedef struct LNode {     int     data;     struct LNode    *next; }LNode, *LinkedList; 并且这个单链表有一个头指针list指向第一个结点,最后一个结点指向NULL,很容易理解. 最容

单链表-利用原空间把链表反转

问题描述 利用原空间把链表反转 请问大家,如果我用头插法新建好了一个单链表,当我们想利用原空间把链表反转的 时候,我下面标注(1)和(2)是什么意思? (1)这样设定,不是把p->next和p指向一起了吗? //反转链表 void reverse(linklist L,int n) { linklist p,r; p=L->next; int i; for(i=1;i<=n;i++) { r=p->next; p->next=L->next; (1)--// 什么意思?

c语言 数据结构-单链表的就地逆置 辅助空间为O(1)

问题描述 单链表的就地逆置 辅助空间为O(1) 求大神给个单链表的就地逆置 要不开拓辅助空间 原谅我没有C币 解决方案 struct Node{ int value; Node *next; }; void reverse(Node* head){ Node *prev, *cur, *next; cur = head; prev = NULL; while(cur != NULL){ next = cur->next; cur->next = prev; prev = cur; cur =