单链表的逆置是一个经常被问到的面试题,也是一个非常基础的问题。比如一个链表是这样的:1->2->3->4->5 通过逆置后成为5->4->3->2->1。
指路:单链表的插入、删除。
最容易想到的方法是遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。
首先要我们定义三个指针,让他们分别指向第一个和第一个有效数据节点,并将第一个数据节点的next域制空,反转后的链表中他是尾节点。
循环遍历每一个节点直到链表结束,保存要修改指针的next域的地址,然后再进行修改,修改完成所有指针往前移。
最后将头结点指向原来的尾节点,即原来的尾节点充当第一个有效数据节点。
具体实现:
Node *Reverse(List plist)
{
Node*p = plist->next;
Node *q = p->next ;
Node* tmp ;
p->next = NULL;
while(q != NULL)
{
tmp = q->next;
q->next = p;
p = q;
q = tmp;
}
plist ->next =p;
return plist;
}