Leetcode打卡四:将给定的单链表L: L 0→L 1→…→L n-1→L n, 重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→… 要求使用原地算法,并且不改变节点的
题目:
将给定的单链表L: L 0→L 1→…→L n-1→L n,
重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→…
要求使用原地算法,并且不改变节点的值
例如:
对于给定的单链表{1,2,3,4},将其重新排序为{1,4,2,3}.
/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public void reorderList(ListNode head) {}}
分析
思路一:
(这个思路是我一开始想的思路,不仅麻烦而且不符合题目要求)
1.将该链表复制为两个新的独立链表head1,head2
2.每次将head2的节点插入到head1的倒数第二个节点,然后将head1的最后两个节点一起拿出来链到我们的结果链表,然后将head1进行断链。
举个例子:
- 第一次将head2的0节点,插入到head1的倒数第二个节点,也就是n节点的前驱,这样head1节点的最后两个节点就是0->n,
- 之后就可以将这两个节点取出来插入到一个新的空链表,也就是我们的结果存储链表
- 然后将head1链表断链,经过第一次的循环,我们的结果链表中存了0->n,head1中的尾节点变成了n-1,下次我们还是找到倒数第二个节点插入即可
- 经过第二次插入,head1中最后两个节点为1->n-1,我们取出来,再断链!
3.而实际上这个算法是可行的,只是太过于复杂,因为我对链表的复制还不是很熟悉,以为直接指向就就可以了,但是实际上必须所有的节点全部创建新节点传值,才可以实现。
思路二:(标准解法)
1.找到head的中间节点,进行断链,分为head1,head2
2.将head2进行原地反转
3.将head2和head1进行交叉插入即可
这个方法是我没有想到的,首先如何找到中间节点,这样就要用到快慢节点去寻找,设置一个快节点,慢节点即可。其次链表的原地反转也是我没有接触过的,因为之前对算法基本没怎么学!后来链表的原地反转是从头开始,每次断一个节点,连一个节点!
public static void reorderList1(ListNode head) {if(head == null || head.next == null) return;ListNode fastPoint = head;//快节点ListNode slowPoint = head;//慢节点ListNode midPoint;//中间节点//找到中间节点while(fastPoint.next != null && fastPoint.next.next != null ){fastPoint = fastPoint.next.next;slowPoint = slowPoint.next;}midPoint = slowPoint;//断成两个链表ListNode head2 = midPoint.next;midPoint.next = null;//后半段链表翻转ListNode q = head2.next;head2.next = null;while(q != null){ListNode qNext = q.next;q.next = head2;head2 = q;q = qNext;}//将head2 插入head1ListNode head1 = head;while( head2 != null){ListNode newList = head2.next;head2.next = head1.next;head1.next = head2;head2 = newList;head1 = head1.next.next;}}
总结:
1.对于快慢节点寻找中间节点的方法第一次接触,另外我还知道快慢节点还可以判断是否为循环链表
2.链表原地反转也是我不会的,也要仔细琢磨
3.中间程序运行有一个bug就是,以后对于链表是否为空的判断,一定要先判断前驱节点,再判断后驱节点,例如不能这么写while(p->next && p),这样就会出现空指针异常的情况
4.关于链表复制和断链的问题,我要切记每次遍历只要将头结点记录好就行了,链表就不会断。链表的复制不是简单的指向
Leetcode打卡四:将给定的单链表L: L 0→L 1→…→L n-1→L n, 重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→… 要求使用原地算法,并且不改变节点的相关推荐
- 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...
- c语言给定一个单链表输入k,C语言实现单链表(不带头结点)的基本操作
链表在数据结构和算法中的重要性不言而喻.这里我们要用C来实现链表(单链表)中的基本操作.对于链表的基本概念请参考<数据结构与算法之链表>这篇博客.示例代码上传至 https://githu ...
- Leetcode打卡 | No.24 两两交换链表中的节点
No.24 两两交换链表中的节 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. ...
- [Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]
[问题描述][简单] [解答思路] 1. 递归 自底向上 基本条件/终止条件:当前节点或者下一个节点==null 递推关系: head.next.next = head 在函数内部,改变节点的指向,也 ...
- 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。 请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。如下实例。示例 :输入: 1->2->3->4-
#include<stdio.h> #include<stdlib.h>struct LB {int data;struct LB *next; };struct LB *Cr ...
- 数据结构与算法(二)单链表(Singly linked list)
数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...
- 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点...
题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法 ...
- 6-1 单链表逆转(PTA数据结构与算法题目集)
本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...
- 左神算法:将单链表的每K个节点之间逆序(Java版)
本题来自左神<程序员代码面试指南>"将单链表的每K个节点之间逆序"题目. 题目 给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K 个节点之间逆序,如果 ...
最新文章
- 15张令人震撼的物理动图,看完惊呆了!
- c:foreach中varStatus参数的含义
- 数据分析学习总结笔记09:文本分析
- 三极管开关电路_利用三极管设计开关电路
- Python生成文档(PDF, HTML)
- 计算摄影学基础知识(1)
- SSM——SpringMVC笔记1
- n9005zhuenb6 Android 5,三星Galaxy Note3(港版N9005)刷机与ROOT教程【详细介绍】
- vue手写签名,canvas手写签名,canvas签名图片旋转
- Blueprint Framemaker介绍
- Golang 对接Google翻译
- R语言入门与数据分析(1)
- 计算机名与netbios名
- Docker 从入门到入坑。
- 下载神器IDM安装与使用(保姆级教程)
- 移动联通电信4g和移动4g有什么区别
- 常用简体中文字体转Unicode和Unicode 2编码对照表
- PDF文件怎么转换为图片?
- fiddler app https抓包
- [AJava]FusionCharts Free中文开发指南[使用文档教程]第十二章--FCF中的特殊字符
热门文章
- 【初创公司系列】由软件先驱Tom Siebel支持的机器学习创业公司C3.ai申请IPO
- PostgreSQL之如何敲开PG的大门?
- 车载应用技术——Android Automotive系统
- html制作图片动画效果代码,HTML5 Canvas:制作动画特效
- 华为云宝塔linux,华为云上安装宝塔面板
- 苹果电脑如何打印文件
- Ae 入门系列之二:素材的导入与管理
- 小红伞杀毒软件自动化调用
- python爬取公众号阅读量_公众号没做起来,那是你菜 | 爬取21个公众号数据后
- 小米手机线下营销方案设计(毕业作品+任务书+设计方案+成果报告书)