206. Reverse Linked List [难度:简单]
【题目】
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
【解题C++】
iteratively or recursively 来,积累英语词汇了~ 迭代和递归。话说这个居然归类为简单orz,大概是我在模拟方面比较笨蛋,我一直认为逆转链表是很难的部分了......
迭代有很多种实现方法,如下的就是在遍历链表的同时,让结点一个个掉头指向新结点,这个过程要更新新结点和头结点的指向,最后返回新结点就好啦。(ps:这个代码非常顶真,实在不懂也方便记忆)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//迭代版
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
//初始结点最后会成为尾结点,所以要置空
ListNode *newL = NULL,*tmp = NULL;
if(head==NULL) return head;
//遍历链表
while(head)
{
//记录下一个要遍历的结点
tmp = head->next;
//当前结点指向新结点
head->next = newL;
//更新新结点指向
newL = head;
//更新要遍历的结点指向
head = tmp;
}
return newL;
}
};
递归的核心是把问题的规模缩小,再调用函数一层层返回(栈的思想),最后还得加个终止条件。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//递归版
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
ListNode *p1,*p2;
//前者是空链表的判断,后者是边界条件
if(head==NULL||head->next==NULL)
return head;
p1 = head; //记录当前结点a0
p2 = head->next; //记录下一结点a1
head = reverseList(p2); //返回a1~an逆转后的头结点
p2->next = p1; //用上面逆转后的尾结点指向原来的头结点
p1->next = NULL; //原来的头结点逆转后作为尾结点,next域置空
return head;
}
};
【解题Python】
思路同C++。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# 迭代版
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
newL = tmp = None
while head:
tmp = head.next
head.next = newL
newL = head
head = tmp
return newL
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# 递归版
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
p1 = p2 = head
if head is None or head.next is None:
return head
p1 = head
p2 = head.next
head = self.reverseList(p2)
p2.next = p1
p1.next = None
return head