【数据结构初阶】单链表经典算法题十道(详解+图例)—得道飞升(上篇) ...

打印 上一主题 下一主题

主题 360|帖子 360|积分 1080

目录
1、移除元素
2、反转链表
3、链表的中心节点
4、合并两个有序链表
Relaxing Time!!!
————————————————  天气之子·幻  ————————————————




1、移除元素



思绪:
创建一个新链表(newhead,newtail),遍历原链表,把不等于 val 的结点尾插到新链表中。
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. *     int val;
  5. *     struct ListNode *next;
  6. * };
  7. */
  8. typedef struct ListNode ListNode;
  9. struct ListNode* removeElements(struct ListNode* head, int val) {
  10.     //创建新链表
  11.     ListNode* newhead;ListNode* newtail;
  12.     newhead=newtail=NULL;
  13.     //遍历数组
  14.     ListNode* pcur=head;
  15.     while(pcur)
  16.     {
  17.         if(pcur->val!=val)
  18.         {
  19.             //又分两种情况,链表为空,不为空
  20.             if(newhead==NULL)
  21.             {
  22.                 newtail=newhead=pcur;
  23.             }
  24.             else
  25.             {
  26.                 newtail->next=pcur;
  27.                 newtail=newtail->next;
  28.             }
  29.         }
  30.         pcur=pcur->next;
  31.     }
  32.     //[7,7,7,7,7],val=7 ,这种情况下,newtail=NULL,newtail->next=NULL,此时newtail不能解引用,所以加上if条件
  33.     if(newtail)               
  34.         newtail->next=NULL;
  35.     return newhead;
  36. }
复制代码
留意:
当原链表为空时,newhead = newtail = pcur; 
在实例中,最后一个5结点被尾插到新链表中时,5结点的next指针指向的仍然是背面的6结点,所以最后返回的时间结果里面含有6,所以我们把最后一个等于val结点的next指针指向NULL即可!

2、反转链表



新奇思绪:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. *     int val;
  5. *     struct ListNode *next;
  6. * };
  7. */
  8. typedef struct ListNode ListNode;
  9. struct ListNode* reverseList(struct ListNode* head) {
  10.     //链表也有可能是空链表
  11.     if(head==NULL)
  12.     {
  13.         return head;
  14.     }
  15.     //定义三个指针变量
  16.     ListNode* n1,*n2,*n3;
  17.     n1=NULL;n2=head;n3=n2->next;
  18.     while(n2)
  19.     {
  20.         n2->next=n1;
  21.         n1=n2;
  22.         n2=n3;
  23.         if(n3)
  24.         n3=n3->next;
  25.     }
  26.     return n1;
  27. }
复制代码

3、链表的中心节点


思绪: 
奇数个结点

偶数个结点 

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. *     int val;
  5. *     struct ListNode *next;
  6. * };
  7. */
  8. typedef struct ListNode ListNode;
  9. struct ListNode* middleNode(struct ListNode* head) {
  10.     ListNode* slow=head;
  11.     ListNode* fast=head;
  12.     //while(fast->next&&fast)错误,不可互换顺序,当为偶数个结点时,fast==NULL循环结束,但是while
  13.       循环内会先判断fast->next,空指针不能解引用,会报错
  14.     while(fast&&fast->next)
  15.     {
  16.         //慢指针每次走一步
  17.         //快指针每次走两步
  18.         slow=slow->next;
  19.         fast=fast->next->next;
  20.     }
  21.     //此时slow指向的结点恰好是中间结点
  22.     return slow;
  23. }
复制代码
快慢指针为什么可以找到中心结点?(快慢指针的原理)
慢指针每次走一步,快指针每次走两步,当快指针走到链表的尾结点时,假设链表的长度为n,快指针走的路程是慢指针的两倍,2*慢=快,即慢指针走的路程是n/2。

4、合并两个有序链表



思绪:
创建一个新链表,newhead,newtail 指向新链表的头结点,界说两个指针分别指向原链表的头结点,两个指针指向的数据比较大小,谁小谁尾插到新链表里面。思绪清晰,不过要留意许多细节,直接上代码:
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. *     int val;
  5. *     struct ListNode *next;
  6. * };
  7. */
  8. typedef struct ListNode ListNode;
  9. struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
  10.     //处理原链表为空链表的情况
  11.     if(list1==NULL)
  12.     {
  13.         return list2;
  14.     }
  15.     if(list2==NULL)
  16.     {
  17.         return list1;
  18.     }
  19.     //创建一个新链表
  20.     ListNode* newhead=NULL;
  21.     ListNode* newtail=NULL;
  22.     //创建两个指针分别指向两个链表的头结点来遍历原链表
  23.     ListNode* l1=list1;
  24.     ListNode* l2=list2;
  25.    
  26.     while(l1&&l2)
  27.     {
  28.         if(l1->val<l2->val)
  29.         {
  30.             //l1尾插到新链表
  31.             if(newtail==NULL)
  32.             {
  33.                 newtail=newhead=l1;
  34.             }
  35.             else
  36.             {
  37.                 newtail->next=l1;
  38.                 newtail=newtail->next;
  39.             }
  40.             l1=l1->next;
  41.         }
  42.         else
  43.         {
  44.             //l2尾插到新链表
  45.             if(newhead==NULL)
  46.             {
  47.                 newtail=newhead=l2;
  48.             }
  49.             else
  50.             {
  51.                 newtail->next=l2;
  52.                 newtail=newtail->next;
  53.             }
  54.              l2=l2->next;
  55.         }
  56.     }
  57.     //出循环,要么l1==NULL,要么l2==NULL
  58.         if(l1)
  59.             newtail->next=l1;  想想这里为啥不用while循环?
  60.         if(l2)
  61.             newtail->next=l2;
  62.     return newhead;
  63. }
复制代码
  1. //优化过后,申请一个不为空的链表,就无需再判断新链表是否为空,最后不要忘记free
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. *     int val;
  6. *     struct ListNode *next;
  7. * };
  8. */
  9. typedef struct ListNode ListNode;
  10. struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
  11.     //链表为空的情况
  12.     if(list1==NULL)
  13.     {
  14.         return list2;
  15.     }
  16.     if(list2==NULL)
  17.     {
  18.         return list1;
  19.     }
  20.    
  21.     //创建一个新链表
  22.     ListNode* newhead,*newtail;
  23.      newhead=newtail=(ListNode*)malloc(sizeof(ListNode));
  24.     //定义两个指针来遍历数组
  25.     ListNode* l1=list1;
  26.     ListNode* l2=list2;
  27.     while(l1&&l2)
  28.     {
  29.         if(l1->val<l2->val)
  30.         {
  31.             newtail->next=l1;
  32.             l1=l1->next;
  33.             newtail=newtail->next;
  34.         }
  35.         else
  36.         {
  37.             newtail->next=l2;
  38.             l2=l2->next;
  39.             newtail=newtail->next;
  40.         }
  41.     }
  42.     if(l1)
  43.         newtail->next=l1;
  44.     if(l2)
  45.         newtail->next=l2;
  46.     ListNode* ret=newhead->next;
  47.     free(newhead);
  48.     newhead=NULL;
  49.     return ret;
  50.    
  51. }
复制代码



完—

Relaxing Time!!!


————————————————  天气之子·幻  ————————————————



天气之子·幻_TypeD_高音质在线试听_天气之子·幻歌词|歌曲下载_酷狗音乐酷狗音乐为您提供由TypeD演唱的高清音质无损天气之子·幻mp3在线听,听天气之子·幻,只来酷狗音乐!
https://t4.kugou.com/song.html?id=b43Kh7aCPV2





至此竣事——
再见——




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表