持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
Hi, 大家好。
今后会按类分享算法题。
开始分享链表相关的算法题。
今天分享第一道题:反转链表
206. 反转链表
leetcode地址:leetcode.cn/problems/re…
难度
简单
描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
示例2
输入: head = [1,2]
输出: [2,1]
示例3
输入: head = []
输出: []
提示:
- 链表中节点的数目范围是
[0, 5000] -5000 <= Node.val <= 5000
解法1
- 定义三个变量
- 定义变量 pre, 开始指向链表第一个值的前面,初始值为null
- 定义变量cur,指向链表的第一个节点,也就是head
- 定义变量next,指向第一个节点的下一个节点,也就行head.next,相当于cur.next
- 开始循环,当cur不是null的时候,一直可以遍历
- 首先将cur指向pre,这样就把第一个节点反转
- 然后把pre指向cur
- 最后把cur指向next
- 这样就可以进行下一个节点反转,直到cur为null
- 最后返回pre
解法2
用递归函数不断传入head.next,直到head==null或者heade.next==null,到了递归最后一层的时候,让后面一个节点指向前一个节点,然后让前一个节点的next置为空,直到到达第一层,就是链表的第一个节点,每一层都返回最后一个节点。
解法3
准备一个临时节点,然后遍历链表,准备两个指针head和next,每次循环到一个节点的时候,将head.next指向temp.next,并且将temp.next指向head,head和next向后移一位。
下面使用解法1 用代码实现以下:
代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let pre = null;
let cur = head;
while(cur !== null){
let next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
};