水下功夫做透,水上才能顺风顺水。

《链表》之无表头链表逆序

 前插法


 

typedef struct Node{     
int value;  //数据域     
Node *next; //指针域 
}Node;

void reverseLink(Node* ph)
{
    if((NULL == ph)||(NULL == ph->next))
        return ph;
    
    Node* pSub = ph->next;
    ph->next = NULL;
    //当前指针变成头指针,头指针变成次级指针
    while(NULL != pSub)
    {
        Node* tmp = pSub->next;//类比循环前,先找新的子链
        pSub->next = ph;//类比循环前,当前节点前移动
        ph = pSub;
        pSub = tmp;
    }
}

 

  public ListNode reverseList(ListNode head) {
        ListNode curr = head;
ListNode prev = null;
while (curr != null) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }

 

void reverseBetweenLink(Node* head,int m,int n){
    
   if(head==NULL||head->next==NULL){
        return;
   }
   if(m<1||m>=n){
       return;  
    }
    Node* p1=head;
    Node* p3 = head;
    while(n>0){
        if(m>2){
            p1=p1->next;//头前一个节点的指针
            m--;
        }
        p3=p->next;//尾后一个节点的指针
        n--;
    }
    
    if(m=1){
        Node* p2 = p1->next;
        p1->next = p3;
        
    }else{
        Node* p2=p1->next->next;//开始逆序的下一节点的指针
        p1->next->next = p3;    
    }
   
    
    
    while(p2!=p3){
        Node* tmp = p2->next;
        if(m=1){
            p2->next = p1;
            p1 = p2;
        }else{
            p2->next = p1->next;
            p1->next = p2;
        }
        p2=tmp;
    }

}    

 

posted @ 2015-04-19 09:22  北方寒士  阅读(149)  评论(0)    收藏  举报