代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题.链表相交、142.环形链表II

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

题目链接:24.两两交换链表中的节点

解法:定义虚拟头节点

思路:设置临时节点,将cur节点下一位节点指向2节点,2节点下一位节点指向1节点,cur节点移动两位实现下一轮交换。

class Solution {
     public ListNode swapPairs(ListNode head) {
        ListNode pre = new ListNode();
        pre.next = head;
        ListNode cur = pre;
        while(cur.next != null && cur.next.next != null) {
            ListNode next3 = cur.next.next.next;
            ListNode next2 = cur.next.next;
            ListNode next1 = cur.next;
            cur.next = next2;
            next2.next = next1;
            next1.next = next3;
            cur = cur.next.next; 
        }
        return pre.next;
    }
}

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

题目链接:19.删除链表的倒数第N个节点

解法:定义虚拟头节点+快慢指针法

思路:调用for循环使快指针移动n步后,快指针和慢指针同时移动,当快指针下一位指向null时,循环结束,通过slow.next = slow.next.next删除该节点,返回头结点。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyhead = new ListNode(0);
        dummyhead.next = head;
        ListNode fast = dummyhead;
        ListNode slow = dummyhead;
        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 dummyhead.next;
    }
}

面试题.链表相交

题目链接:链表相交

解法:快慢指针法

思路:长短链表分别定义快慢指针。长短链表指针同时走,第一轮中短链表中的指针走完后去走长链表的指针,如果有交点,快慢指针会在第二轮相遇。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode fastA = headA;
        ListNode slowA = headA;
        ListNode fastB = headB;
        ListNode slowB = headB;
        while(fastA!=null||fastB!=null){
            if(fastA==null){
                slowB = slowB.next;
                fastB = fastB.next;
            }
            else if(fastB == null){
                fastA = fastA.next;
                slowA = slowA.next;
            }
            else{
                fastA = fastA.next;
                fastB = fastB.next;
            }
        }
        while(slowA!=null&&slowB!=null){
            if(slowA == slowB){
                return slowA;
            }
            else{
                slowA = slowA.next;
                slowB = slowB.next;
            }
        }
        return null;
    }
}

142.环形链表II 

题目链接:142.环形链表II 

解法:快慢指针法

思路:

1.判断链表是否有环:使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast==slow ,说明这个链表有环。

2.找到环的入口:从头结点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是环形入口的节点。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                ListNode index1 = fast;
                ListNode index2 = head;
                while (index1 != index2) {
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值