本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *reverse( struct ListNode *head );
其中head
是用户传入的链表的头指针;函数reverse
将链表head
逆置,并返回结果链表的头指针。
输入样例:
1 2 3 4 5 6 -1
输出样例:
6 5 4 3 2 1
裁判测试程序样例我就不再复述了,来看我做这个题的应该都在PTA上看过了。
struct ListNode *reverse( struct ListNode *head )
{
/*定义尾节点end*/
struct ListNode *temp1=head;
struct ListNode *temp2=head;
struct ListNode *end=head;
/*检查head是否为空链表*/
if(head==NULL) return end;
//找出尾节点
while(temp2->next!=NULL){
temp2=temp2->next;
}
end=temp2;
//当temp2移动到首元节点则停止循环
while(temp2!=head){
/*temp1从首元节点开始向后移动,temp2从尾节点开始,一
旦temp1的下一个节点是temp2,那么temp2的下一个节点修改
为temp1当前所在的节点,随后temp1重新从首元节点开始移动
temp2则向前移动一个节点*/
if(temp1->next==temp2){
temp2->next=temp1;
temp2=temp2->next;
temp1=head;
}else{
temp1=temp1->next;
}
}
temp2->next=NULL;
return end;
}