206、反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
难度:简单 题目地址:https://leetcode-cn.com/problems/reverse-linked-list/
1、C语言代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *p,*q,*pr;
p = head;
q = NULL;
while(p){
pr = p->next;
p->next = q;
q = p;
p = pr;
}
return q;
}
解释: 迭代法求解,在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
知识点回顾: 链表的相关知识。
可参考我的《数据结构之单链表》篇,也可以参考B站视频反转链表。
2、Java代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
}
解释: 递归法求解。
- 最开始 1 -> 2 -> 3 -> 4
- 对于head.next.next = head , 当head在 3 时,相当于加了一个4 -> 3 ,形成回环, 即 1 -> 2 -> 3 <-> 4
- 然后 head.next = None, 取消回环,消除了 3 -> 4
- 1 -> 2 -> 3 <- 4
知识点回顾: 链表的相关知识。
3、Python代码:
# 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:
p, rev = head, None
while p:
rev, rev.next, p = p, rev, p.next
return rev
解释: 类似于C语言的求解思路。
知识点回顾: 链表的相关知识。
4、JavaScript代码:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let cur = head // 当前节点
let prev = null // 前置节点初始化(head节点无前置节点)
while(cur){
let temp = cur.next // 保存当前节点的后置节点 之后递归到下一个节点需要
cur.next = prev
prev = cur
cur = temp
};
return prev
};
解释: 类似于C语言的求解思路。
知识点回顾: 链表的相关知识。
本文最后给大家推荐一篇博客:图解反转单向链表