• 《数据结构教程》(李春葆 主编)课后习题【2.4】


    【2.4】

    设计一个算法,将一个带头节点的数据域依次为a1,a2,……,an(n>=3)的单链表的所有节点逆置,即第一个节点的数据域变为an,……,最后一个节点的数据域变为a1。


      思路:我是直接在原链表上操作,当然也可以创建一个数组存储链表的数据,然后再倒序放回原链表。

      答案

     1 void invert(LinkList *&head)    //逆置链表处理 
     2 {
     3     LinkList* p = head->next;
     4     LinkList* pri = NULL;    //之前的节点 
     5     while(p){
     6         LinkList* q = new LinkList;
     7         q->data = p->data;    //把当前节点记录下来 
     8         q->next = pri;
     9         pri = q;
    10         head->next = q;
    11         LinkList* t = p;    //当前节点没用了删除掉 
    12         p=p->next;
    13         delete(t);
    14     }
    15 }

      测试代码

     1 //链表逆置
     2 //思路是遍历原链表,不断将当前节点以头插法插到head头节点后面,以此实现逆置 
     3 
     4 #include <iostream>
     5 using namespace std;
     6 #define Max 10 
     7 struct LinkList{
     8     int data;
     9     LinkList* next;
    10 };
    11 void CreateLinkList(int a[],int n,LinkList* &head)        //创建一个链表,把a数组中的数据依次放进去 
    12 {
    13     LinkList *p = head;
    14     for(int i=0;i<n;i++){
    15         LinkList *q = new LinkList;
    16         q->data = a[i];
    17         q->next = NULL;
    18         p->next = q;
    19         p = q;
    20     }
    21 }
    22 void Display(LinkList *&head)    //输出链表 
    23 {
    24     LinkList *p = head->next;
    25     while(p!=NULL){
    26         cout<<p->data<<' ';
    27         p=p->next;
    28     }
    29     cout<<endl;
    30 }
    31 void invert(LinkList *&head)    //逆置链表处理 
    32 {
    33     LinkList* p = head->next;
    34     LinkList* pri = NULL;    //之前的节点 
    35     while(p){
    36         LinkList* q = new LinkList;
    37         q->data = p->data;    //把当前节点记录下来 
    38         q->next = pri;
    39         pri = q;
    40         head->next = q;
    41         LinkList* t = p;    //当前节点没用了删除掉 
    42         p=p->next;
    43         delete(t);
    44     }
    45 }
    46 int main()
    47 {
    48     int a[Max],n=Max;
    49     for(int i=0;i<Max;i++)
    50         a[i] = i+1;
    51     LinkList *head = new LinkList;
    52     CreateLinkList(a,n,head);    //将数组a中的元素顺序创建成一个链表 
    53     Display(head);    //输出该链表 
    54     invert(head);    //将该链表逆置处理 
    55     Display(head);    //输出处理后的链表 
    56     return 0;
    57 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/yym2013/p/3608569.html
Copyright © 2020-2023  润新知