对单链表进行反转有迭代法和递归法两种。

1. 迭代法

  • 迭代法从前往后遍历链表,定义三个指针分别指向相邻的三个结点,反转前两个结点,即让第二个结点指向第一个结点。然后依次往后移动指针,直到第二个结点为空结束,再处理链表头尾即可。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) { if (head == NULL || head->next == NULL) // 空链或只有一个结点,直接返回头指针
{
return head;
}
else // 至少有两个结点
{
ListNode * p1 = head; // 第一个结点
ListNode * p2 = p1->next; // 第二个结点
ListNode * p3 = p2->next; // 第三个结点 while (p2) // 第二个结点为空,到链尾,结束
{
p3 = p2->next;
p2->next = p1; // 第二个结点指向第一个结点,进行反转
p1 = p2; // 第一个结点往后移
p2 = p3; // 第二个结点往后移
} head->next = NULL; // 第一个结点也就是反转后的最后一个节点指向 NULL
head = p1; // 头结点指向反转后的第一个节点
return head;
}
}
};

2. 递归法

  • 基线条件:空链或只有一个结点,直接返回头指针
  • 递归条件:递归调用,返回子链表反转后的头指针

Solution {
public:
ListNode* reverseList(ListNode* head) { if (head == NULL || head->next == NULL) // 空链或只有一个结点,直接返回头指针
{
return head;
} else // 有两个以上结点
{
ListNode *new_head = reverseList(head->next); // 反转以第二个结点为头的子链表 // head->next 此时指向子链表的最后一个结点 // 将之前的头结点放入子链尾
head->next->next = head;
head->next = NULL; return new_head;
}
}
};

获取更多精彩,请关注「seniusen」!

LeetCode 206——反转链表的更多相关文章

  1. LeetCode 206. 反转链表(Reverse Linked List) 16

    206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...

  2. 每天一道面试题LeetCode 206 -- 反转链表

    LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ...

  3. leetCode:206 反转链表

    206. 反转链表 题目:反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 非递归代码: class Solution { public ListNode reverseLis ...

  4. Java实现 LeetCode 206 反转链表

    206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ...

  5. leetcode 206. 反转链表 及 92. 反转链表 II

    206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...

  6. LeetCode 206.反转链表(Python3)

    题目: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶:你可 ...

  7. leetcode 206 反转链表 Reverse Linked List

    C++解法一:迭代法,使用前驱指针pre,当前指针cur,临时后继指针nxt: /** * Definition for singly-linked list. * struct ListNode { ...

  8. Leetcode春季打卡活动 第二题:206. 反转链表

    Leetcode春季打卡活动 第二题:206. 反转链表 206. 反转链表 Talk is cheap . Show me the code . /** * Definition for singl ...

  9. LeetCode 92. 反转链表 II(Reverse Linked List II)

    92. 反转链表 II 92. Reverse Linked List II 题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. LeetC ...

随机推荐

  1. CentOS 7 安装oracle 11G

    一.安装Oracle前准备 首先要设置主机名,并在/etc/hosts下解析. 镜像没挂全,导致缺少包pdksh-5.2.14.compat-libstdc++-33-3.2.3 1.创建运行orac ...

  2. 访问oracle数据库

    如果是本地 :sqlplus system/xxx(用户名/密码) 远程到服务器, sqlplus system/xxx(用户名/密码) @IP:port/orcl(orcl为数据库实例)

  3. 数据库:DDL/DML/DCL/TCL基本概念

    SQL(Structure Query Language)语言是数据库的核心语言 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: ...

  4. wubiuefi-支持新版本ubuntu的wubi

    由于某些原因,ubuntu官方不再提供新版的wubi 这就使得部分想快速且安全尝试新版ubuntu的用户望而却步 最近在外文网站找到了wubi的新版本wubiuefi,支持最新版的ubuntu 目前支 ...

  5. Oracle数据库用户密码设为无限期

    oracle数据库用户密码默认为180天,密码过期后将无法登陆数据库. 一.查询用户所属PROFILE SQL> SELECT username,PROFILE FROM dba_users; ...

  6. MySQL里面的锁

    MySQL里面的锁可以分为:全局锁,表级锁,行级锁. 一.全局锁:对整个数据库实例加锁.MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL)这个命令可以 ...

  7. 打造开源GIS方案

    现在GIS用途较多,最近要有所接触,所以决定自己打造一个已经又的方案.均以Java作为开发 二位地图:客户端:geotools,swing,geoserver; web:openlayer,geose ...

  8. Web前端几种常见的实现水平垂直居中的方法

    第一种: 父容器不设置宽度,用定位实现水平垂直居中. <!DOCTYPE html> <html lang="en"> <head> <m ...

  9. 重装系统后激活win10和office2016

    激活win10: 重装的版本和电脑刚买来是的系统一样的话直接联网,过一段时间就会自动激活.如果不一样可以下载Kms工具激活. 激活office2016: 在开始菜单里双击“我的Office”,登录账号 ...

  10. Flask中对MySQL的基本操作

    在Flask-SQLAlchemy中,插入.修改.删除操作,均由数据库会话管理. 会话用 db.session 表示.在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提 ...