笔试题三:带头节点head链表逆序

原创 2013年12月02日 20:19:00
链表的的标准结构体:
struct ListNode
{
 int data;
 ListNode * nextNode;
}

要求将一带链表头List head的单向链表逆序。

分析:

  1). 若链表为空或只有一个元素,则直接返回;

  2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;

  3). 重复2),直到q为空

  4). 调整链表头和链表尾

 

 

 

实现如下:

 

#include <stdio.h>
#include <stdlib.h>

typedef struct tagListNode{
    int data;
    struct tagListNode* next;
}ListNode, *List;

void PrintList(List head);
List ReverseList(List head);

int main()
{
    //分配链表头结点
    ListNode *head;
    head = (ListNode*)malloc(sizeof(ListNode));
    head->next = NULL;
    head->data = -1;

    //将[1,10]加入链表
    int i;
    ListNode *p, *q;
    p = head;
    for(int i = 1; i <= 10; i++)
    {
        q = (ListNode *)malloc(sizeof(ListNode));
        q->data = i;
        q->next = NULL;
        p->next = q;
        p = q;        
    }

    PrintList(head);           /*输出原始链表*/
    head = ReverseList(head);  /*逆序链表*/
    PrintList(head);           /*输出逆序后的链表*/
    return 0;
}

List ReverseList(List head)
{
    if(head->next == NULL || head->next->next == NULL)  
    {
       return head;   /*链表为空或只有一个元素则直接返回*/
    }

    ListNode *t = NULL,
             *p = head->next,
             *q = head->next->next;
    while(q != NULL)
    {        
      t = q->next;
      q->next = p;
      p = q;
      q = t;
    }

    /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/
    head->next->next = NULL;  /*设置链表尾*/
    head->next = p;           /*调整链表头*/
    return head;
}

void PrintList(List head)
{
    ListNode* p = head->next;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("/n");
}


 

C语言实现单链表的逆序打印(带头结点)

我在之前一篇博客《C语言实现单链表(不带头结点)的逆序打印》中详细实现了对一个不带头节点的链表的逆序打印,整体思路也是非常的简单,也就是依次遍历原链表,然后把取出的节点用头插法建立一个新的链表,新链表...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 20:07
  • 3458

已知链表的头结点head,写一个函数把这个链表逆序

若链表为空或只有一个元素,则直接返回;   2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;   3). 重复2),直到q为空   4). 调整链表头和链表尾...
  • u012353408
  • u012353408
  • 2013年10月07日 11:14
  • 2664

链表的创建(带头节点以及不带头节点)

基础不扎实,写一晚上才勉强写完了自己的链表创建,必须一点一点写代码才能找到自己的问题,再一点一点修正。问题再多也要一点一点面对。 #include #include #include typede...
  • q8821773
  • q8821773
  • 2015年05月05日 09:20
  • 338

已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel)

我们假设单向链表的节点如下: template typename T> class list_node { public: list_node * next; T data; }; ...
  • u014299265
  • u014299265
  • 2016年09月29日 20:57
  • 1221

数据结构c语言实现-链表(带和不带头节点)

数据结构与算法分析——c语言描述 第3章   第二节   表 1.带头结点(原书)   稍微改造一下 #include #include struct N...
  • Richard1997
  • Richard1997
  • 2017年03月06日 17:13
  • 564

带头节点的链表和不带头结点的链表有何不同

单链表是一种最为基本的数据结构,常用的单链表又分为带头结点和不带头结点两种。从线性表的定义可以知道,线性表要求允许在任意位置进行插入和删除操作。所有的链表都有一个头指针head,带头结点的链表中hea...
  • woshiwanghao_hi
  • woshiwanghao_hi
  • 2014年04月14日 15:28
  • 4403

C++之带头节点单链表的简单操作

#ifndef _LINK_H_ #define _LINK_H_ class List { public: List(); ~List(); void insert(con...
  • Allureyou
  • Allureyou
  • 2017年03月08日 22:19
  • 970

数据结构_不带头结点的链表逆制

1:以前写的都是带有头节点的链表的逆制,其思想是:把头节点后的后一个节点摘下来进行头插就可以了,实现的方法也不难,只需要两个指针就可以实现,而我这主要实现的是不带头节点的链表,而且时间复杂度位O(n)...
  • zhou753099943
  • zhou753099943
  • 2015年10月26日 19:22
  • 901

计算带头结点单链表的长度 计算单链表的长度,实现单链表的打印

计算单链表的长度
  • u012388338
  • u012388338
  • 2014年05月08日 20:39
  • 1308

数据结构——带头结点链表和不带头结点链表操作比较

带头结点的链表和不带头结点的链表主要不同点在插入和删除操作上。同时要注意,带头结点的链表初始化操作时建立头结点。 下面我们来看一下代码中的异同: #include #include #include ...
  • dd864140130
  • dd864140130
  • 2014年11月26日 09:51
  • 644
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔试题三:带头节点head链表逆序
举报原因:
原因补充:

(最多只允许输入30个字)