leetcode链表反转链接

要求摘要:

反转一个单链表

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

做法是考虑把链表中结点的next指向它的上一个结点,以此来进行反转。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/ struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
return NULL;
struct ListNode* pre=NULL;
struct ListNode* p=head;
struct ListNode* h=NULL;
while(p)
{
h=p; //h不断变化,最终为反转链表的头结点
struct ListNode* tmp=p->next; //tmp不断指向下一个结点,用于遍历链表
p->next=pre; //将p结点的指针域由指向p的下一个结点,转而指向p的上一个结点
pre=p; //将pre设为当前结点,取下一个结点时,pre即为下一个结点的上一个结点
p=tmp; //即p=p->next,不断取下一个结点
}
两两交换链表中的节点

要求摘要:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:给定 1->2->3->4, 你应该返回 2->1->4->3。

做法:

每一次操作需要知道三个结点,当前结点的上一个结点tmp,当前结点pre,当前结点的下一个结点tail。可以看做每三个结点一组。其中,本组当前结点pre的上一个结点tmp,是上一组的最后一个节点tail,然后对本组的pre和tail进行交换操作。

移动到下一个结点或者说移动到下一组:

具体结点交换操作步骤示意图:

完整代码:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/ truct ListNode* swapPairs(struct ListNode* head){
//如果为空返回NULL;只有一个节点原样返回
if(head==NULL)
return NULL;
if(head->next==NULL)
return head; struct ListNode* tmp=NULL; //作用是保存一次循环后的末位节点
struct ListNode* pre=head;
struct ListNode* tail=NULL; tail=head->next; //先进行一次结点交换操作是为了确定头结点
//结点交换
pre->next=tail->next;
tail->next=pre;
head=tail;
tmp=pre; //保存末位节点 pre=pre->next; //当前结点后移,便于下一次操作
if(pre==NULL || pre->next==NULL) //如果链表只有两个或三个结点,返回该链表
return head; while(pre && pre->next)
{
tail=pre->next;
//结点交换
pre->next=tail->next;
tail->next=pre;
tmp->next=tail;
tmp=pre; //保存末位节点 pre=pre->next;
} return head;
}

另,附上一个很简洁的代码:

ListNode *swapPairs(ListNode *head) {
if (!head) return NULL;
if (!head->next) return head;
ListNode *temp = head->next;
head->next = swapPairs(temp->next);
temp->next = head;
return temp;
}

这段代码原帖:https://blog.csdn.net/stay_the_course/article/details/88729356

链表反转&交换链表结点的更多相关文章

  1. 2、java数据结构和算法:单链表: 反转,逆序打印, 合并二个有序链表,获取倒数第n个节点, 链表的有序插入

    什么也不说, 直接上代码: 功能点有: 1, 获取尾结点 2, 添加(添加节点到链表的最后面) 3, 添加(根据节点的no(排名)的大小, 有序添加) 4, 单向链表的 遍历 5, 链表的长度 6, ...

  2. 链表反转 (Multi-method)

    链表反转是链表相关问题最基础的知识,做完LeetCode中LinkedList后才会有这种体会,因为ACM算法中不会涉及这一部分.解决这一问题有多种方法,在面试中面试官通常也会要求写出多种.包括sta ...

  3. java实现链表反转

    为什么面试常考链表反转 链表是常用的数据结构,同时也是面试常考点,链表为什么常考,因为链表手写时,大多都会有许多坑,比如在添加节点时因为顺序不对的话会让引用指向自己,因此会导致内存泄漏等问题,Java ...

  4. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  5. [LintCode] Swap Two Nodes in Linked List 交换链表中的两个结点

    Given a linked list and two values v1 and v2. Swap the two nodes in the linked list with values v1 a ...

  6. c 单链表反转(不添加新结点空间)

    最近复习考研,加上一直都将"算法"放在很高的位置,所以,蛮重视算法的.不多说了,其实这个问题,不难理解的. 主要代码: //反转单链表. void reverse(linklist ...

  7. Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)

    Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...

  8. php 单向链表反转 reverse (没有空的头结点)

    * 参照php标准库设计接口 http://php.net/manual/en/class.spldoublylinkedlist.php * 反转单向链表 reverse方法, 其他的方法为了方便测 ...

  9. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

随机推荐

  1. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  2. day18 python模块 random time sys os模块

    day18 python   一.random模块     取随机整数 import random print(random.randint(1,2))                 #顾头顾尾 p ...

  3. PL SQL安装

    首先,在官网下载PL SQL 的对应版本,本机是64位的就下载64位的,网址:https://www.allroundautomations.com/downloads.html#PLS 点击应用程序 ...

  4. SYSAUX表空间满,

    step1.  确认到底是哪个段占用了sysaux空间: select segment_name,sum(bytes)/1024/1024 from dba_segments where tables ...

  5. java之重装系统重新配置环境变量 jdk、eclipse、idea、Oracle、svn、gitlab等环境变量的安装

    前言:由于公司电脑进行统一版本升级,需要重装系统(只对C盘做升级),记录一下踩过的坑! 首先理一下思路,看那些东西需要做: 1.jdk及其环境变量 2.eclipse(文件夹版的需要运行项目进行测试) ...

  6. macOS 和 Linux 的内核区别

    有些人可能会认为 macOS 和 Linux 内核之间存在相似之处,因为它们可以处理类似的命令和类似的软件.有些人甚至认为苹果公司的 macOS 是基于 Linux 的.事实上是,两个内核有着截然不同 ...

  7. S1 Python 基础

    定义规范 声明变量 name = "Alex Li" 变量定义规则 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 以下关键字不能声明为变量名['and' ...

  8. url 上回调函数(JSONP原理)

    1.JSONP原理:就是跨域的 js程序(get请求对应url,获取到文本数据,在script标签中,就是按照 js 程序执行,)执行时  调用  当前程序中写好的函数,并且把跨域的数据(即参数),传 ...

  9. Spring Boot学习一之配置类及自动配置

    一.配置类 1. 导入其他配置类 你不需要将所有的 @Configuration 放进一个单独的类, @Import 注解可以用来导入其他配置类.另外,你也可以使用 @ComponentScan 注解 ...

  10. spring cloud gateway 拦截request Body

    在接入Spring-Cloud-Gateway时,可能有需求进行缓存Json-Body数据或者Form-Urlencoded数据的情况. 由于Spring-Cloud-Gateway是以WebFlux ...