题目:删除倒数第n个节点
连接:https://leetcode-cn.com/problems/SLwz0R/
给定一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
第一种思路:
第一种解法思路: 创建一个虚拟节点和快慢指针(两个指针),再定义一个前驱节点(pre),先让fast走n步,再让快慢指针一起走,走到fast==null的时候停下来,此时slow节点刚好在要删除的节点的位置上, pre刚好在slow的前一个节点,那么只需要pre.next=slow.next既可以做到删除了倒数第n个节点。
代码:
/**
* 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) {
// 双指针之快慢指针
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode fast=dummy;
ListNode slow=dummy;
while((n--)>0){
fast=fast.next;
}
ListNode pre=null;
while(fast!=null){
pre=slow;
slow=slow.next;
fast=fast.next;
}
pre.next=slow.next;
return dummy.next;
}
}
第二种思路;
第二种解法思路,创建一个虚拟节点指向头结点,创建快慢指针指向虚拟节点,直接先让fast先走n+1步,然后两个节点再一起走,当fast==null的时候,slow节点刚好在要删除节点的前一个,此时只需要让slow.next=slow.next.next。 这个方法相比较于第一种方法原理都是一样的,区别只是少了定义一个pre节点和 fast先夺走了n+1步
代码:
/**
* 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) {
// 双指针之快慢指针
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode fast=dummy;
ListNode slow=dummy;
while((n--)>=0){// 用虚拟节点后 直接让fast先走n+1 个节点这样可以让slow节点在删除节点的前面停下来
fast=fast.next;
}
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
slow.next=slow.next.next;
return dummy.next;
}
}