题目
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
解析
观察到空间复杂度为O(1),也就是说不允许我们开辟新的内存空间,也就是要求链表原地置逆。既然不能开辟新的内存空间,就只能通过操作指针来完成原地置逆的操作。
最开始想到的应该是将next指针指向当前结点的前一个结点,那又该如何找前一个结点呢?
可以在最开始将cur指针指向头结点,pre指针指向空,这样cur->next操作以后就是一个指向null的指针,而pre则指向cur,cur指向cur->next,完成了一次反转以及遍历后移。
对以后的每一位都实现这样的操作,即保存cur->next,反转,pre后移,cur后移,直到cur指向null时,遍历完整个链表,返回当前的头结点,即pre的值。
代码
struct ListNode* ReverseList(struct ListNode* pHead ) {
struct ListNode*cur=pHead; //将cur指针指向头结点
struct ListNode*pre=NULL; //pre指针指向cur的前一个结点,即NULL
struct ListNode*next=NULL; //next指针初始化指向哪里无所谓,之后会重新赋值
while(cur){
next=cur->next; //用next先保存cur的后继,防止后来找不到cur->next
cur->next=pre; //反转,即将原先后继的指针指向当前结点的前一个结点
pre=cur; //pre指针后移一位,移动到cur的位置
cur=next; //cur指针后移一位,移动到next的位置
}
return pre;
}