首页 > 其他分享 >day04

day04

时间:2022-09-24 21:46:08浏览次数:34  
标签:head ListNode cur next 链表 day04 节点

Leetcode24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)
image

//
class Solution{
	public ListNode swapParis(ListNode head){
		listNode dummyhead=new listNode(-1,head); //定义一个虚拟头结点  指向head
		ListNode cur =dummyhead;   //不直接用dummyhead 来操作 
		while(cur.next!=null&&cur.next.next!=null){   //必须是&& 因为只有 成对的两个节点才会进行交换
			ListNode temp=cur.next.next.next;  // 用来 保存 需要交换的两个节点之后的 节点
			ListNode pred=cur.next;  //保存 第一个要交换的节点;
			cur.next=pred.next;
			cur.next.next=pred;
			pred.next=temp;   //三步 交换  两个节点顺序
			cur=cur.next.next  //cur 直接向后遍历两个位置
		}
	}
}
//方法2  递归法  [解析链接](https://lyl0724.github.io/2020/01/25/1/ "解析链接")
class Solution{
	public ListNode swapParis(ListNode head){
		if(head==null||head.next==null){
		return head;
		}
		ListNode pre=head.next;
		head.next=swapParis(pre.next);
		pre.next=head;
		return pre;
	}
}

leetcode 19删除链表倒数第N个节点

image

class Solution{
	public ListNode removeNthFromEnd(ListNode head, int n) {
		LinkNode dummyNode=new LinkNode(-1 ,head); //设置虚拟头结点
		ListNode fast=dummyhead;
        ListNode slow =dummyhead;  //设置 快慢指针,解题关键:先让 快指针 向后遍历 n次 慢指针留在原
		//地,此时  款满指针距离为 n-1,然后快慢指针一起向后遍历,
		//直到快指针到最后一个节点 ,此时快慢指针  慢指针落在要删除的节点前一个位置。
		for(int i=0;i<n;i++){
			fast=fast.next;
		}
		while(fast.next!=null){
			fast=fast.next;
			slow=slow.next;
		}
		slow.next=slow.next.next;
		return dummyNode.next;
	}



}

142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。
image

题目分为两个步骤 1:先判断是否有环 2找到环的入口
设置 一个 快慢指针 fast 速度为2, slow速度为1
如果有环, 那么 fast和slow一定会在环里面相遇
假设环的入口 为 a , 入口到相遇的位置为b
slow 走到了b, 走了 a+b的路程
又因为fast是slow 速度的两倍 所以 fast 走了2*(a+b)
所以 slow 绕环继续走 a+b 又回到了b点,所以环剩下的长度 也等于 a
可以利用这个条件 让一个节点 从头开始遍历 ,另一个节点从相遇的地方开始遍历,速度相同,路程也相同,那么相遇的地方就是环的入口了。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fastNode=head;
        ListNode slowNode=head;
        boolean hasCycle=false;

        while(fastNode!=null&&fastNode.next!=null && fastNode.next.next!=null){
            fastNode=fastNode.next.next;
            slowNode=slowNode.next;
            if(fastNode==slowNode){
                hasCycle=true;
                break;
            }
        }
        if(hasCycle){
            ListNode cur = head;
            while(cur!=slowNode){
                cur=cur.next;
                slowNode=slowNode.next;
            }
            return cur;
        }else{
            return null;
        }        
    }
}

///面试题 02.07. 链表相交   难度不大 有点麻烦
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode a=headA;
        ListNode a1=headA;
        ListNode b=headB;
        ListNode b1=headB;
        int lengthA=0,lengthB=0;
        while(a!=null){
            lengthA++;
            a=a.next;
        }
        while(b!=null){
            lengthB++;
            b=b.next;
        }
        if(lengthB>lengthA){
            int temp=lengthA;
            lengthA=lengthB;
            lengthB=temp;
            ListNode tmepNode=a1;
            a1=b1;
            b1=tmepNode;
        }
        int lengthGap=lengthA-lengthB;
        while(lengthGap-->0){
            a1=a1.next;
        }
        while(a1!=null){
            if(a1==b1){
                return a1;
            }
            a1=a1.next;
            b1=b1.next;
        }
        return null;
       
    }
}

标签:head,ListNode,cur,next,链表,day04,节点
From: https://www.cnblogs.com/wdnmdp/p/16726740.html

相关文章

  • day04-2发送文件
    多用户即时通讯系统044.编码实现034.6功能实现-发送文件功能实现4.6.1思路分析客户端(发送者):先把文件a.jpg读取到客户端的字节数组把文件对应的字节数组封装到messag......
  • day04-3服务器推送新闻
    多用户即时通讯系统044.编码实现034.7功能实现-服务器推送消息功能实现4.7.1思路分析服务器推送新闻,本质其实就是群发消息在服务器启动一个独立线程,专门负责推送新闻......
  • Day04
                                ......
  • day04-1群聊功能
    多用户即时通讯系统044.编码实现034.5功能实现-群聊功能实现4.5.1思路分析群聊的实现思路和私聊的实现非常类似。不同的是:私聊时,服务端接收到消息后,只需要找出接收方......
  • JavaLearnDay04
    流程控制一、if分支结构(一)基本if分支结构作用:根据某个条件,控制某些代码执行与否语法:if(布尔表达式){ //当布尔表达式结果为true时,执行}布尔类型表达式:结果......
  • Day04笔记
    01.explicit的作用(了解)classMaker{public: //explicit只能放在构造函数前面,构造函数只有一个参数或其他参数有默认值时 explicitMaker(intn)//防止编译器优化Mak......
  • Day04表格标签
    表格为什么使用表格?简单通明,结构稳定基本结构:单元格行列跨行跨列<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>表格学习</ti......
  • Day04
    ###位运算假设A=00111100​B=00001101A&B=00001100//零零得零,AB上下位相同得1A|B=00111101//零零得零,AB上下位01,10,11都得1A^B=00110001//零零得零,AB上下位0......
  • Day04写程序hello world
    Helloworld随便新建一个文件夹,存放代码新建一个java文件文件后缀名为javaHello.java【注意点】系统可能没有显示文件后缀名,我们需要手动打开编写代码......
  • x_DAY04(前端知识点)
    一、npm包管理工具 1、NPM全称NodePackageManager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具,相当于前端......