反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
题解
迭代
迭代还是很容易理解的,就是设置一个prev,然后交换即可
next = cur.nextcur.next = prevprev = curcur = next
JavaScript
var reverseList = function(head) {let prev = null;let curr = head;while (curr) {// 交换const next = curr.next;curr.next = prev;prev = curr;// 往下一个节点走curr = next;}return prev;};
Python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
pre=None
cur = head
while cur:
next=cur.next
cur.next=pre
pre=cur
cur=next
return pre
递归
可能有点不好理解,慢慢理解吧
- 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作ret
- 此后,每次函数在返回的过程中,让当前结点的下一个结点的next指针指向当前节点
- 同时让当前结点的next指针指向NULL ,从而实现从链表尾部开始的局部反转
- 当递归函数全部出栈后,链表反转完成

var reverseList = function(head) {
if (head == null || head.next == null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};
