2025年- H29-Lc137- 19.删除链表的倒数第N个节点(快慢指针)---java版
1.题目描述
2.思路
快慢指针都在虚拟头节点,然后让快指针先走n+1步,接下来,快慢指针以前移动,直到快指针指向null,慢指针指向被删节点的前一个节点。
3.代码实现
方法一:不带测试用例
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//1.创建一个虚拟头节点,虚拟头节点的指针指向第一个节点ListNode dummyhead = new ListNode(0);dummyhead.next=head;//2.快慢指针都从虚拟头节点出发ListNode fast = dummyhead;ListNode slow = dummyhead;//3.让快指针先走n+1步for (int i = 0; i <= n; i++) {fast = fast.next;}//4.快慢指针同时移动,直到快指针指向空的时候停止while(fast!=null){fast=fast.next;slow=slow.next;}//此时把倒数前n+1节点的指针,指向最后一个节点slow.next=slow.next.next;return dummyhead.next;}
}
方法2:带测试用例
class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }}
public class H19 {public ListNode removeNthFromEnd(ListNode head, int n) {//1.创建一个虚拟头节点,虚拟头节点的指针指向第一个节点ListNode dummyhead = new ListNode(0);dummyhead.next=head;//2.快慢指针都从虚拟头节点出发ListNode fast = dummyhead;ListNode slow = dummyhead;//3.让快指针先走n+1步for (int i = 0; i <= n; i++) {fast = fast.next;}//4.快慢指针同时移动,直到快指针指向空的时候停止while(fast!=null){fast=fast.next;slow=slow.next;}//此时把倒数前n+1节点的指针,指向最后一个节点slow.next=slow.next.next;return dummyhead.next;}public static void main(String[] args){H19 test=new H19();ListNode node5=new ListNode(5,null);ListNode node4=new ListNode(4,node5);ListNode node3=new ListNode(3,node4);ListNode node2=new ListNode(2,node3);ListNode head=new ListNode(1,node2);ListNode result=test.removeNthFromEnd(head,2);System.out.print("删除链表的倒数第N个节点:");while(result!=null)//当前的result不为空{System.out.print(result.val);//取值if(result.next!=null)//if是有限次循环,如果用while则会陷入无限循环{System.out.print("->");}result=result.next;}}}