两两交换链表的结点 🎨
24. 两两交换链表中的节点 - 力扣(LeetCode)
题目描述👓:
解题思路🧶:
根据题意要求 不能单纯的改变节点内部的值,并且需要将实际的节点进行交换
这道题小王同学采用的是递归的方式
具体的操作看小王的代码 🎪
代码如下🎆:
class Solution { public ListNode swapPairs(ListNode head) { //递归结束的条件是 头节点不存在或头节点的下一个节点不存在。 此时不需要交换咱们的相邻的节点 直接返回 头节点就行了 if(head==null||head.next==null) return head; //获取当前节点的下一个节点 ListNode next=head.next; //进行递归 ListNode newNode=swapPairs(next.next); //两两交换 next.next=head; head.next=newNode; return next; } }
删除链表的倒数第N个结点👕
19. 删除链表的倒数第 N 个结点
题目描述🦺:
解题思路🧤:
这道题就是一道经典的双指针的题型,如果我们要删除倒数第N个节点
定义两个指针 fast 和slow 让fast移动n步,然后让fast和slow同时移动
直到fast指向链表末尾。删掉slow所指向的节点就可以了。
图解🍖 :
定义fast和slow两个指针,初始化值为虚拟头结点
我们以第一个n=2为例子来解释 🍦
第一步🍽:
第二步🍣:
首先让我们的fast指针先走n+1步 这里的n为2,n+1的原因是这样slow才能指向删除节点的上一个节点
第三步🦪:
fast和slow同时移动,直到fast指向末尾
第四步🍜 :
删除slow指向的下一个节点
代码附上:
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { //设置虚拟头结点 ListNode dummy=new ListNode(-1); dummy.next=head; ListNode fast=dummy; //定义双指针 ListNode slow=dummy; while(n-->0){ fast=fast.next; } ListNode prev=null; while(fast!=null){ //fasst 和slow指针同时移动知道fast指向末尾 prev=slow; slow=slow.next; fast=fast.next; } prev.next=slow.next; //上一节点的next指针绕过slow直接指向了slow的下一个节点 //slow.next=null; return dummy.next; } }