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. 在IDEA中如何将Spring boot项目打包成可执行的jar包并发布到linux服务

    这两年微服务很流行,这里简单介绍一下如何将自己使用idea写的微服务打包成一个可执行的jar包,并发布到linux服务器的步骤.因为spring boot有内置的tomcat所以一般使用内置的tomc ...

  2. Sass-加法

    程序中的运算是常见的一件事情,但在 CSS 中能做运算的,到目前为止仅有 calc() 函数可行.但在 Sass 中,运算只是其基本特性之一.在 Sass 中可以做各种数学计算 (一).加法 加法运算 ...

  3. STREAM Benchmark及其操作性能分析

    STREAM 是业界广为流行的综合性内存带宽实际性能 测量 工具之一.随着处理器处理核心数量的增多,内存带宽对于提升整个系统性能越发重要,如果某个系统不能够足够迅速地将内存中的数据传输到处理器当中,若 ...

  4. 消费者与生产者---LinkedList方式模拟

    采用LinkedList数据结构方式来模拟消费者与生产者模型,小Demo import java.util.LinkedList; public class MyQueue { private fin ...

  5. Hibernate入门核心配置文件和orm元数据配置文件详解

    框架是什么? 框架是用来提高开发效率的 封装了一些功能,我们需要使用这些功能时,调用即可,不用手动实现 所以框架可以理解为一个半成品的项目,只要懂得如何使用这些功能即可 Hibernate是完全面向对 ...

  6. centos 6.5 配置阿里云 yum 镜像

    配置国内镜像目的是为了加速软件下载安装速度,参考链接:http://mirrors.aliyun.com/help/centos 备份.养成文件操作前备份的习惯 cd /etc/yum.repos.d ...

  7. centos 6.5 配置网络

    编辑 vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改内容 DEVICE="eth0" BOOTPROTO="static& ...

  8. grep正则表达式(二)

    任意字符(The Any Character) dot or period character: "." grep -h '.zip' dirlist*.txt ".&q ...

  9. Python3解leetcode Binary Tree Paths

    问题描述: Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. E ...

  10. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...