单链表的基础知识主要包括链表节点的删除、链表节点的插入、链表的排序、链表的逆置、寻找链表的中间节点、寻找链表的倒数第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 }