关于链表逆序的中心思想就是:
用三个结点指针分别记录,第一个和第二个结点,把第一个结点后指为NULL,由首结点作为尾结点。然后把第二个指向第一个,再然后同
时移动,使第二个结点为第三个结点,第一个结点为第二个结点。就这样依次串连就得到一个逆序的链表了。呵呵,以前我没想到这个方法时,自己
想了个超级笨的,就是遍历出结点的个数,然后用个双重循环不停的找到最后一个结点然后串连,用的是顺序表的思想,实在是愚笨啊,呵呵,思想
差不多就这样,搞不懂就自己画图表示,下面结合代码:
#include <stdio.h> struct Node { int data; struct Node *next; }; typedef struct Node Node; Node * converse(Node *_head); //逆序的函数 int main() { Node a,b,c,d; //为方便演示创建一个简单链表 Node *head,*current; a.data=1; a.next=&b; b.data=2; b.next=&c; c.data=3; c.next=&d; d.data=4; d.next=NULL; head = &a; current=head; //为方便演示创建一个简单链表 while(current!=NULL) { printf("the value is %d\n",current->data); current=current->next; } //输出逆序前的链表 head=converse(head); printf("the converse order is :\n"); current=head; while(current != NULL) { printf("the value is :%d\n",current->data); current=current->next; } //输出逆序后的链表 return 0; } Node * converse(Node *_head) { Node *current1,*current2,*current3,*head; head=_head; if(head == NULL) return NULL; //如果链表为空则返回空 else if(head->next==NULL) return head; //如果只有一个结点则返回 current1=head->next; //找到第二个结点 current2=head->next; //同样指向第二个结点 current3=head; //指向head结点也就是第一个结点 current3->next=NULL; //把第一个结点为最后一个,指向NULL while(current1->next!=NULL) { current1=current1->next; //找到后一个结点 current2->next=current3; //把第二个结点后指第一个结点 current3=current2; //然后把尾结点往前移动到第二个结点 current2=current1; //同样后移到第三个结点 } current2->next=current3; head=current2; //返回逆序后的结点 return head; }
注意:此为不带头的链表哦!