• 单链表的基础知识


             单链表的基础知识主要包括链表节点的删除、链表节点的插入、链表的排序、链表的逆置、寻找链表的中间节点、寻找链表的倒数第m个节点,本文主要是用代码对这些基础问题进行了实现。

    typedef struct node{
                int data;
                node *next;
            }node;

    • 节点的删除

         

     1 node *remove(node *head,const int &target)
     2 {
     3     node *p1,*p2;
     4     p1=head;
     5     while (p1->data!=target && p1->next!=NULL)
     6     {
     7         p2=p1;
     8         p1=p1->next;
     9     }
    10     if (target==p1->data)
    11     {
    12         if (p1==head)
    13         {
    14             head=p1->next;
    15             free(p1);
    16         }
    17         else
    18         {
    19             p2->next=p1->next;
    20             free(p1);
    21         }
    22     }
    23     else
    24     {
    25         cout<<"The list dosen't include the target."<<endl;
    26     }
    27 
    28     return head;
    29 
    30 }
    • 节点的插入
     1 node *insertNoHead(const node *head,node *prevoiusPtr,const int &target)
     2 {
     3     node *insertPtr;
     4     insertPtr=new node;
     5     insertPtr->data=target;
     6     insertPtr->next=prevoiusPtr->next;
     7     prevoiusPtr->next=insertPtr;
     8     return head;
     9 }
    10 
    11 node *insertHead(node *&head,const int &target)
    12 {
    13     node *insertPtr;
    14     insertPtr=new node;
    15     insertPtr->next=head;
    16     head=insertPtr;
    17     return head;
    18 }
    • 单链表的排序
     1 node *sort(node *head)
     2 {
     3     node *p,*p1,*p2;
     4     int n;
     5     int temp;
     6     n=length(head);
     7     if (head==NULL || head->next==NULL)
     8     {
     9         return head;
    10     }
    11     else
    12     {
    13         p=head;
    14         for (int j=1;j<n;j++)
    15         {
    16             p=head;
    17             for (int i=0;i<n-j;i++)
    18             {
    19                 if (p->data>p->next->data)
    20                 {
    21                     temp=p->data;
    22                     p->data=p->next->data;
    23                     p->next->data=temp;
    24                 }
    25                 p=p->next;
    26             }
    27         }
    28         return head;
    29     }
    30     
    31 }
    • 链表的长度
     1 int length(node *head)
     2 {
     3     int sum=0;
     4     while(head)
     5     {
     6         sum++;
     7         head=head->next;
     8     }
     9     return sum;
    10     
    11 }
    • 链表的逆置
     1 node *reverse(node *head)
     2 {
     3     node *p1,*p2,*p3;
     4     if (head==NULL || head->next==NULL)
     5     {
     6         return head;
     7     }
     8     else
     9     {
    10         p1=head;
    11         p2=p1->next;
    12         while(p2)
    13         {
    14             p3=p2->next;
    15             p2->next=p1;
    16             p1=p2;
    17             p2=p3;
    18 
    19         }
    20         head->next=NULL;
    21         head=p1;
    22         return head;
    23     }
    24 }
    • 寻找单链表的中间节点

           首先设置两个指针p1和p2都指向头指针,然后p1指针一次走一步,p2指针一次走两步,当p2走到单链表的末尾时,此时p1所指向的节点即为中间节点。

     1 node *searchMiddle(node *head)
     2 {
     3     node *p1,*p2;
     4     p1=p2=head;
     5     int n=length(head);
     6     if(n<3)
     7     {
     8         return head;
     9     }
    10     else
    11     {
    12         while(p2->next && p2->next->next)
    13         {
    14             p2=p2->next->next;
    15             p1=p1->next;
    16 
    17         }
    18         return p1;
    19     }
    20 }
    • 寻找但链表中倒数第m个节点

         方法一:首先求出单链表总的长度n,然后从链表的头节点开始遍历,当遍历到n-m个节点时,即为链表中倒数第m个节点。

    node *FindReverseM1(node *head,int m)
    {
        node *p;
        int n=length(head);
        if (n==0 || m>n)
        {
            return NULL;
        }
        
        p=head;
        for(int i=0;i<n-m;i++)
        {
            p=p->next;
        }
        return p;
    }

       方法二:首先设置两个指针p1和p2,同时指向单链表的头节点,然后用p2遍历链表,将p2指向链表中第m个节点,接着将p1和p2同时进行遍历,当p2指向链表中末尾节点时,p1所指向的节点即为倒数第m个节点。

     1 node *FindReverseM2(node *head,int m)
     2 {
     3     node *p1,*p2;
     4     int n=length(head);
     5     if (n==0 || n<m)
     6     {
     7         return NULL;
     8     }
     9     p1=p2=head;
    10     for (int i=0;i<m;i++)
    11     {
    12         p2=p2->next;
    13     }
    14     while(p2)
    15     {
    16         p2=p2->next;
    17         p1=p1->next;
    18     }
    19     return p1;
    20 }
  • 相关阅读:
    Linux 下配置多路径及SCSI扫描磁盘重新发现大小
    vSphere vSwitch网络属性配置详解
    勤动脑筋
    如何用visual studio2013编写简单C语言程序
    两个字符窜,在母窜中查找子窜的位置
    如何安装Microsoft Visual C++6.0
    看张子阳如何在30岁前年薪超过30万觉得很有道理几点
    标志位放错了位置
    注意细节
    探索式学习
  • 原文地址:https://www.cnblogs.com/Trony/p/2555735.html
Copyright © 2020-2023  润新知