【要求】链表长度为N,时间复杂度为O(N),空间复杂度为O(1);
【注意】链表含有一个虚拟节点
【反转单链表】含有虚拟节点,传入的head为虚拟节点,返回的也是
struct ListNode{
int value;
ListNode* next;
ListNode(int val):value(val),next(NULL){}
};
/*反转链表,含有虚拟节点,传入的head为虚拟节点,返回的也是*/
ListNode* reverseList(ListNode* head){
ListNode* tmp = NULL;
ListNode* cur = head->next;//ListNode* cur = head; //不含虚拟头节点,此处改
ListNode* pre = NULL;
while(cur){
tmp = cur->next;//保存cur的下一节点
cur->next = pre;//反转
pre = cur;//更新pre,cur
cur = tmp;
}
head->next = pre; //return pre; //不含虚拟头节点,直接返回
return head;
}
【反转双向链表】
struct ListNode{
int value;
ListNode* next;
ListNode* last;
ListNode(int val):value(val){}
};
ListNode* reverseDoubleList(ListNode* head){
ListNode* pre = NULL;
ListNode* cur = head->next;//ListNode* cur = head;//不含虚拟头节点
ListNode* tmp = NULL;
while(cur != NULL){
tmp = cur->next;
cur->last = tmp;
cur->next = pre;
pre = cur;
cur = tmp;
}
head->next = pre;//return pre;//不含虚拟头节点直接返回
return head;
}