反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
https://leetcode-cn.com/problems/reverse-linked-list/
迭代
思路是在原链表之前建立一个空的newHead,因为首节点会变,然后从head开始,将之后的一个节点移到newHead之后,重复此操作直到head成为末节点为止,代码如下:
c++
lass Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *newHead = NULL;
while (head) {
ListNode *t = head->next;
head->next = newHead;
newHead = head;
head = t;
}
return newHead;
}
};
java
class Solution {
public ListNode reverseList(ListNode head) {
//申请节点,pre和 newHead,pre指向null
ListNode pre = null;
ListNode newHead = head;
ListNode tmp = null;
while(newHead!=null) {
//记录当前节点的下一个节点
tmp = newHead.next;
//然后将当前节点指向pre
newHead.next = pre;
//pre和newHead节点都前进一位
pre = newHead;
newHead = tmp;
}
return pre;
}
}
python
class Solution(object):
def reverseList(self, head):
# 申请两个节点,pre和 newHead,pre指向None
pre = None
newHead = head
# 遍历链表,while循环里面的内容其实可以写成一行
# 这里只做演示,就不搞那么骚气的写法了
while newHead:
# 记录当前节点的下一个节点
tmp = newHead.next
# 然后将当前节点指向pre
newHead.next = pre
# pre和newHead节点都前进一位
pre = newHead
newHead = tmp
return pre
递归
递归解法的思路是,不断的进入递归函数,直到head指向倒数第二个节点,因为head指向空或者是最后一个结点都直接返回了,
newHead则指向对head的下一个结点调用递归函数返回的头结点,此时newHead指向最后一个结点,然后head的下一个结点的next指向head本身,这个相当于把head结点移动到末尾的操作,
因为是回溯的操作,所以head的下一个结点总是在上一轮被移动到末尾了,但head之后的next还没有断开,所以可以顺势将head移动到末尾,再把next断开,最后返回newHead即可,代码如下:
c++
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode *newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
};
java
class Solution {
public ListNode reverseList(ListNode head) {
//递归终止条件是当前为空,或者下一个节点为空
if(head==null || head.next==null) {
return head;
}
//这里的newHead就是最后一个节点
ListNode newHead = reverseList(head.next);
//如果链表是 1->2->3->4->5,那么此时的newHead就是5
//而head是4,head的下一个是5,下下一个是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止链表循环,需要将head.next设置为空
head.next = null;
//每层递归函数都返回newHead,也就是最后一个节点
return newHead;
}
}
python
class Solution(object):
def reverseList(self, head):
# 递归终止条件是当前为空,或者下一个节点为空
if(head==None or head.next==None):
return head
# 这里的newHead就是最后一个节点
newHead = self.reverseList(head.next)
head.next.next = head
# 防止链表循环,需要将head.next设置为空
head.next = None
# 每层递归函数都返回newHead,也就是最后一个节点
return newHead