[LeetCode]206. Reverse Linked List(反转单链表)

xiaoxiao2021-02-27  210

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; }
转载请注明原文地址: https://www.6miu.com/read-9052.html

最新回复(0)