代码随想录 Day04

代码随想录 Day04

代码随想录 相应链接

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

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
在这里插入图片描述

class Solution {
    public ListNode swapPairs(ListNode head) {
        //虚拟头结点的方式来进行操作
        ListNode dummy=new ListNode(0,head);
        ListNode cur= dummy;
        while(cur.next!=null&&cur.next.next!=null){// 注意一定是cur.next在左边 以防止出现空指针异常 
        ListNode temp1=cur.next;
        ListNode temp2=temp1.next.next; //初次出现的变量注意进行类型定义
        cur.next=cur.next.next;
        cur.next.next=temp1;
        temp1.next=temp2;
        cur=cur.next.next;
        }
        return dummy.next;
    }
}

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

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //这个题目的关键就在于怎么找到倒数第n个节点   但是要操作的是倒数第n+1个节点
        ListNode dummy=new ListNode(0,head);
        ListNode fastNode=dummy;
        ListNode slowNode=dummy;//最终使slowNode指向倒数第n+1个节点
        while(n!=0){
            n--;
            fastNode=fastNode.next;
        }
        while(fastNode.next!=null){
            //找到循环的终止点  体会fastNode!=null和fastNode.next!=null最终的fastNode值的不同
            //当找到了终止点 从后往前找倒数第n个就容易了
            fastNode=fastNode.next;
            slowNode=slowNode.next;
            
        }
        
        slowNode.next=slowNode.next.next;
        return dummy.next;
    }
}

02.07. 链表相交

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA=headA;
        ListNode curB=headB;
        int lengthA=0;
        int LengthB=0;
        while(curA!=null){//这种遍历不容易出现空指针异常  如果是curA.next容易出现空指针异常  而且计数会少记一回 到最后一个链表元素不会进入循环 
            lengthA++;    
            curA=curA.next;
        }
        //System.out.println("a的长度是"+lengthA);
        while(curB!=null){
            LengthB++;
            curB=curB.next;
        }
        curA=headA;//遍历之后要重新赋值
        curB=headB;
        //想办法把长的链给A 两个链交换的时候,长度、表头都要交换
        if(lengthA<LengthB){
         int temp;
         temp=lengthA;
         lengthA=LengthB;
         LengthB=temp;
         ListNode tempNode=curA;
         curA=curB;
         curB=tempNode;//经过这个操作已经把长链变成A了
        }
        int gap=lengthA-LengthB;
        while(gap!=0){
            curA=curA.next;
            gap--;
        }
        while(curA!=null){//改成 curA.next则会出现空指针异常 也会少比较最后一个链表的元素
            if(curA==curB){//注意要找的不是值相同 而是结点相同
                return curA;
            }
            curA=curA.next;
            curB=curB.next;
        }
        return null;

    }
}

142.环形链表II

public class Solution {
    public ListNode detectCycle(ListNode head) {
        //使用快慢指针法
        ListNode slowPoint=head;
        ListNode fastPoint=head;
        while(fastPoint!=null&&fastPoint.next!=null){
            fastPoint=fastPoint.next.next;
            slowPoint=slowPoint.next;
            if(fastPoint==slowPoint){
                ListNode curNode1=fastPoint;
                ListNode curNode2=head;
                while(curNode1!=curNode2){
                    curNode1=curNode1.next;
                    curNode2=curNode2.next;
                }
                return curNode1;
            }
        }
        return null;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值