链表逆置

来源:互联网 发布:毛昆仑 常凯申 知乎 编辑:程序博客网 时间:2024/06/03 15:46

链表逆置有以下几种方法

1.就地逆置

采用头插法

SLink* reverse(SLink *L){    if(L==NULL) return NULL;//如果链表为NULL,则返回NULL    else if(L->next ==NULL||L->next->next == NULL) return L;//如果只存在一个头结点或者只存在一个结点,则直接返回L    else    {        SLink *p = L->next,*q;        L->next = NULL;        while(p!=NULL)        {            q = p->next;            p->next = L->next;//p结点采用头插法加入到头结点之后            L->next = p;            p = q;//p指向下一个结点        }        return L;    }

2.辅助指针实现

SLink* reverse1(SLink *L){    if(L==NULL) return NULL; //如果链表为NULL,则返回NULL    else if(L->next == NULL || L->next->next == NULL) return L; //如果链表只有一个头结点或者只有一个数值结点,则直接返回L    else    {        SLink *pre, *p, *q;        pre = L -> next; //pre指向第一个结点        p = pre -> next; //p指向pre下一个结点        q = p -> next; //q指向p下一个结点        L -> next = NULL; //将头节点先指向NULL        pre -> next = NULL; //pre指向的第一个结点逆置后将成为最后一个结点,所以指向NULL        while(p != NULL)        {            p -> next = pre; //p结点逆置后指向前一个结点pre            pre = p; //pre向前指向下一个结点p            p = q; //p向前指向下一个结点q            q = q -> next; //q指向下一个结点        }        L->next = pre; //现在pre指向逆置完后的第一个结点,所以头结点由指向NULL转为指向pre        return L;    }}

欢迎讨论指正

0 0
原创粉丝点击