题解 | #反转链表#
反转链表
http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
1. 解法一(双指针)
ListNode* ReverseList(ListNode* pHead) {
// 创建双指针,分别指向当前头节点和空指针
ListNode* pre = pHead, *cur = nullptr;
// 循环中,当前指针不能为空
while(pre != nullptr){
ListNode *new_node = pre->next; //临时变量,用来存储pre节点的下一个节点
pre->next = cur; // 链表反转,将pre的指针指向cur节点
cur = pre; //指针+1
pre = new_node; // 指针+1
}
return cur; // 返回当前节点,即为反转后的节点
}2. 解法二(交换)
ListNode* ReverseList(ListNode* pHead) {
ListNode* p = nullptr;
while(pHead != nullptr){
swap(pHead->next, p); // 相当于p临时储存为Phead->next;
swap(pHead, p); // 交换head和p,达到反转的目的
}
return p;
}3. 解法三(递归)
ListNode* ReverseList(ListNode* pHead) {
if(head==nullptr || head->next == nullptr) return head; // 终止条件
ListNode *p = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return p;
}4. 解法四(互换值)
ListNode* reverseList(ListNode* head) {
ListNode *p=nullptr;
for(ListNode* x=head; x!=nullptr; x = x->next){
p = new ListNode(x->val, p);
}
return p;
}5. 指定范围内链表反转(迭代)
ListNode* reverseBetween(ListNode* head, int left, int right) {
// 迭代
ListNode *dummyNode = new ListNode(-1);
dummyNode->next = head;
ListNode* cur = dummyNode;
// 先走left步
for(int i=1; i<left; ++i){
cur = cur->next;
}
// 翻转
head = cur->next;
for(int i=left; i<right; ++i){
ListNode* new_node = head->next;
head->next = new_node->next;
new_node->next = cur->next;
cur->next = new_node;
}
return dummyNode->next;
}