题目:

将给定的单链表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→… 要求使用原地算法,并且不改变节点的相关推荐

  1. 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...

  2. c语言给定一个单链表输入k,C语言实现单链表(不带头结点)的基本操作

    链表在数据结构和算法中的重要性不言而喻.这里我们要用C来实现链表(单链表)中的基本操作.对于链表的基本概念请参考<数据结构与算法之链表>这篇博客.示例代码上传至 https://githu ...

  3. Leetcode打卡 | No.24 两两交换链表中的节点

    No.24 两两交换链表中的节 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. ...

  4. [Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]

    [问题描述][简单] [解答思路] 1. 递归 自底向上 基本条件/终止条件:当前节点或者下一个节点==null 递推关系: head.next.next = head 在函数内部,改变节点的指向,也 ...

  5. 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。 请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。如下实例。示例 :输入: 1->2->3->4-

    #include<stdio.h> #include<stdlib.h>struct LB {int data;struct LB *next; };struct LB *Cr ...

  6. 数据结构与算法(二)单链表(Singly linked list)

    数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...

  7. 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点...

    题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少?   解法: 1.对于问题1,使用追赶的方法 ...

  8. 6-1 单链表逆转(PTA数据结构与算法题目集)

    本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...

  9. 左神算法:将单链表的每K个节点之间逆序(Java版)

    本题来自左神<程序员代码面试指南>"将单链表的每K个节点之间逆序"题目. 题目 给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K 个节点之间逆序,如果 ...

最新文章

  1. 15张令人震撼的物理动图,看完惊呆了!
  2. c:foreach中varStatus参数的含义
  3. 数据分析学习总结笔记09:文本分析
  4. 三极管开关电路_利用三极管设计开关电路
  5. Python生成文档(PDF, HTML)
  6. 计算摄影学基础知识(1)
  7. SSM——SpringMVC笔记1
  8. n9005zhuenb6 Android 5,三星Galaxy Note3(港版N9005)刷机与ROOT教程【详细介绍】
  9. vue手写签名,canvas手写签名,canvas签名图片旋转
  10. Blueprint Framemaker介绍
  11. Golang 对接Google翻译
  12. R语言入门与数据分析(1)
  13. 计算机名与netbios名
  14. Docker 从入门到入坑。
  15. 下载神器IDM安装与使用(保姆级教程)
  16. 移动联通电信4g和移动4g有什么区别
  17. 常用简体中文字体转Unicode和Unicode 2编码对照表
  18. PDF文件怎么转换为图片?
  19. fiddler app https抓包
  20. [AJava]FusionCharts Free中文开发指南[使用文档教程]第十二章--FCF中的特殊字符

热门文章

  1. 【初创公司系列】由软件先驱Tom Siebel支持的机器学习创业公司C3.ai申请IPO
  2. PostgreSQL之如何敲开PG的大门?
  3. 车载应用技术——Android Automotive系统
  4. html制作图片动画效果代码,HTML5 Canvas:制作动画特效
  5. 华为云宝塔linux,华为云上安装宝塔面板
  6. 苹果电脑如何打印文件
  7. Ae 入门系列之二:素材的导入与管理
  8. 小红伞杀毒软件自动化调用
  9. python爬取公众号阅读量_公众号没做起来,那是你菜 | 爬取21个公众号数据后
  10. 小米手机线下营销方案设计(毕业作品+任务书+设计方案+成果报告书)