3:倒序打印一个单链表;   递归实现,先递归在打印就变成倒序打印了,如果先打印在调用自己就是顺序打印了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21  | void ReversePrintNode(NodeL* head)
 {
     if (head)
     {
         ReversePrintNode(head->next);
         cout<<head->value<<endl;
     } 
 } 
 void ReversePrintNodeTest()
 {
     NodeL* head=new NodeL();
     NodeL* cur=head;
     for (int i=1;i<10;i++)
     {
         NodeL* tmpNode=new NodeL(i);
         cur->next=tmpNode;
         cur=tmpNode;
     }
     ReversePrintNode(head);
 }
  |  
 
 
 4:给定一个单链表的头指针和一个指定节点的指针,在O(1)时间删除该节点;   删除节点的核心还是将这个节点的下一个节点,代替当前节点。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62  | void DeleteNode(NodeL* head,NodeL* delNode)
 {
     if (!head || !delNode)
     {
         return;
     }
       if (delNode->next!=NULL)
     {
         NodeL* next=delNode->next;
         delNode->next=next->next;
         delNode->value=next->value;
         delete next;
         next=NULL;
     }else if (head==delNode)
     {
         delete delNode;
         delNode=NULL;
         *head=NULL;
     }else
     {
         NodeL* tmpNode=head;
         while (tmpNode && tmpNode->next!=delNode)
         {
             tmpNode=tmpNode->next;
         }
         if (tmpNode!=NULL)
         {
             delete delNode;
             delNode=NULL;
             tmpNode->next=NULL;
         }
     }
 }
   void DeleteNodeTest()
 {
     int nodeCount=10;
     for (int K=0;K<nodeCount;K++)
     {
         NodeL* head=NULL;
         NodeL* cur=NULL;
         NodeL* delNode=NULL;
         for (int i=0;i<nodeCount;i++)
         {
             NodeL* tmpNode=new NodeL(i);
             if (i==0)
             {
                 cur=head=tmpNode;
             }else{
                 cur->next=tmpNode;
                 cur=tmpNode; 
             }
             if (i==K)
             {
                 delNode=tmpNode;
             } 
         }
         DeleteNode(head,delNode) ;
     } 
 }
  |  
 
 
 5:找到链表倒数第K个节点;   通过两个指针,两个指针都指向链表的开始,一个指针先向前走K个节点,然后再以前向前走,当先走的那个节点到达末尾时,另一个节点就刚好与末尾节点相差K个节点。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51  | NodeL* FindKthToTail(NodeL* head,unsigned int k)
 {
     if(head==NULL || k==0)
         return NULL;
     NodeL* tmpNode=head;
     for (int i=0;i<k;i++)
     {
         if (tmpNode!=NULL)
         {
             tmpNode=tmpNode->next;
         }else{
             return NULL;
         } 
     }
     NodeL* kNode=head;
     while (tmpNode!=NULL)
     {
         kNode=kNode->next;
         tmpNode=tmpNode->next;
     }
     return kNode;
 }
   void FindKthToTailTest()
 {
     int nodeCount=10;
     for (int K=0;K<nodeCount;K++)
     {
         NodeL* head=NULL;
         NodeL* cur=NULL; 
         for (int i=0;i<nodeCount;i++)
         {
             NodeL* tmpNode=new NodeL(i);
             if (i==0)
             {
                 cur=head=tmpNode;
             }else{
                 cur->next=tmpNode;
                 cur=tmpNode;  
             }
         }
         NodeL* kNode=FindKthToTail(head,K+3) ;
         if (kNode)
         {
             cout<<"倒数第 "<<K+3<<" 个节点是:"<<kNode->value<<endl;
         }else{
             cout<<"倒数第 "<<K+3<<" 个节点不在链表中" <<endl;
         }
     } 
 }
  |  
 
 
 6:反转单链表;   按顺序一个个的翻转就是了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51  | NodeL* ReverseList(NodeL* head)
 {
     if (head==NULL)
     {
         return NULL;
     }
     NodeL* reverseHead=NULL;
     NodeL* curNode=head;
     NodeL* preNode=NULL;
     while (curNode!=NULL)
     {
         NodeL* nextNode=curNode->next;
         if (nextNode==NULL)
             reverseHead=curNode;  
           curNode->next=preNode;
         preNode=curNode;
         curNode=nextNode;
     }
     return reverseHead;
 }
   void ReverseListTest()
 {
     for (int K=0;K<=10;K++)
     {
         NodeL* head=NULL;
         NodeL* cur=NULL; 
         for (int i=0;i<K;i++)
         {
             NodeL* tmpNode=new NodeL(i);
             if (i==0)
             {
                 cur=head=tmpNode;
             }else{
                 cur->next=tmpNode;
                 cur=tmpNode;  
             }
         }
           cur=ReverseList( head);
         while (cur)
         {
             cout<<cur->value<<" ";
             cur=cur->next;
         }
         cout<<endl;
     }
     cout<<endl;
 }
  |  
 
 
  |