206. Reverse Linked List
Reverse a singly linked list.
反向单链表。
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
提示:
可以迭代或递归地颠倒链表
思路1:
- 现将链表变成环,每次都将原第一个结点之后的那个结点放在新的表头后面,最后断开环。
- 比如1,2,3,4,5 变成1,2,3,4,5->1(环)
- 第一次:把第一个结点1后边的结点2放到新表头后面,变成2,1,3,4,5 ->2(环)
- 第二次:把第一个结点1后边的结点3放到新表头后面,变成3,2,1,4,5 ->3(环)
- 4,3,2,1,5 ->4(环)
5,4,3,2,1 ->5(环)
代码如下:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* res;
ListNode* first;
ListNode* temp;
res = new ListNode(-1);
res->next = head; //将单链表变成环
first = head;//指向原链表的头结点
while(first->next != nullptr){
temp = first->next;//指向即将处理的点
first->next = temp->next;
temp->next = res->next;
res->next = temp;
}
head = res->next;
res->next = nullptr;
return head;
}
思路2:
- 参考了网上别人写的方法,点击查看
代码如下:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* p;
ListNode* q;
ListNode* r;
p = head;
q = head->next;
head->next = nullptr;//旧的头指针是新的尾指针 指向NULL
while(q){
r = q->next;//用来保存下一步要处理的指针
q->next = p;//p q 交替处理 进行反转单链表
p = q;
q = r;
}
head = p;//最后的q必定指向NULL,p就成了新链表的头指针
return head;
}
思路3:
- 递归,参考链接
- 现在需要把A->B->C->D进行反转,
- 可以先假设B->C->D已经反转好,已经成为了D->C->B,那么接下来要做的事情就是将D->C->B看成一个整体,让这个整体的next指向A,所以问题转化了反转B->C->D。那么,
- 可以先假设C->D已经反转好,已经成为了D->C,那么接下来要做的事情就是将D->C看成一个整体,让这个整体的next指向B,所以问题转化了反转C->D。那么,
- 可以先假设D(其实是D->NULL)已经反转好,已经成为了D(其实是head->D),那么接下来要做的事情就是将D(其实是head->D)看成一个整体,让这个整体的next指向C,所以问题转化了反转D。
代码如下:
ListNode* reverseList(ListNode* head) {
if (!head || !(head -> next)) return head;
ListNode* node = reverseList(head -> next);
head -> next -> next = head;
head -> next = NULL;
return node;
}