给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0\leq n\leq10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
代码:
struct ListNode* ReverseList(struct ListNode* pHead ) {
struct ListNode *pre = NULL, *now = NULL, *post = NULL;
if(pHead == NULL){
return NULL;
}else if (pHead->next == NULL){
return pHead;
}else if(pHead->next->next == NULL){
pre = pHead;
now = pHead->next;
now->next = pre;
pre->next = NULL;
return now;
}
pre = pHead;
now = pHead->next;
post = now->next;
pHead->next = NULL;
while(post != NULL){
now->next = pre;
pre = now;
now = post;
post = post->next;
}
now->next = pre;
return now;
}
分析:
链表翻转其实就是将指针指向前一个,姐node->next = pre;但是单向链表只能存一个next,等于前一个链表我们就没法获取后一个链表的地址了,因此,我们需要将前中后三个链表的位置记录,然后进行操作。