反转一个单链表。
示例:
输入: 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