题意:
采用带头结点的单链表,设计一个算法将其就地逆置,所谓“就地”是指辅助空间O(1)。
这里可以有两种方法做:
1.头插法且双指针
2.改变指针指向且三指针
两方法共同点:
头结点还是作为头结点。第一个结点作为尾节点。
单链表的存储结构:
typedef struct LinkList{
int data;
LinkList * next;
}
分析:
这里先解释第二种方法:改变指针指向且三指针
将第一个结点(pre指向)置为空,作为尾节点。
然后再改变结点间的指针指向(循环完成),让pre ,p同步后移。最后将头结点接上即可
思路:
1.这里先定义三个指针pre ,p ,post
p = L->next; post用来保存p的后继结点
2.将第一个结点作为尾节点,pre->next = null;
3.通过while循环,条件为p!= null
post = p->next;
p->next = pre;//修改指针指向(逆置关键)
pre = p,p = post; //向后推
当p为空时,跳出循环,pre指向最后一个节点
4.最后,头结点接上(L->next = pre)
C代码实现:
void Reverse2(LinkList * L){
LinkList * pre = L->next,*p,*post;
p = pre->next;
pre->next = null;
while(p!=null){
post = p->next;
p->next = pre;//修改指针指向
pre = p; p = post; //往后移
}
L->next = pre; //接上头结点
}