LeetCode——206. 反转链表

反转一个单链表。

示例:

输入: 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
原文地址:https://www.cnblogs.com/wwj99/p/12394742.html