笔试题三:带头节点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");
}


 

相关文章推荐

不带头节点的单向链表逆序

分析: 1、单向链表 2、不适用

华为机试题:删除链表中的重复节点、剩余节点逆序输出

描述:  题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排。 要求实现函数:  void ...

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

我在前面几篇博客中《C语言实现链表节点的插入》《C语言实现链表节点的删除》《C实现头插法和尾插法来构建链表》《C语言实现链表的基本操作》实现了链表的很多增删改查操作。这里我们要来实现链表的逆序打印,使...

链表面试题(一):逆序打印链表、无头链表删除插入节点、约瑟夫环、逆置单链表

1. 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 1)顺序表支持随机访问,单链表不支持随机访问。 2)顺序表插入/删除数据效率很低,时间复杂度为O(N)(除尾插尾删),单链表插入/删除效...

单链表逆序——华三、Intel面试题之一

从网上得来,感觉第1种“利用辅助指针”的方法很方便,借鉴一下 对于单链表的逆置有两种方法可以实现: (1)利用辅助指针          基本思想:在遍历结点过程中,设置...

带头节点的双向链表

  • 2012年10月29日 22:31
  • 5KB
  • 下载

带头节点循环单链表的操作(创建,保序插入,指定插入,删除指定表元,删除相同元素,统计某元素表元个数)

//循环单链表的操作 #include struct Node {  int data;  Node *next; }; //创建操作 Node *Creat(int n) { ...
  • yxm418
  • yxm418
  • 2012年03月14日 21:51
  • 1015

不带头节点的单链表倒置算法

  • 2014年10月08日 19:41
  • 942B
  • 下载

带头节点的链表

  • 2014年05月26日 17:38
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔试题三:带头节点head链表逆序
举报原因:
原因补充:

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