题目:
给一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
----------------
示例:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]
-----------------
思路:
遇到这种题多了其实就是公式,数组中有快慢指针,链表同样也可以创建快慢两个指针。
初始右指针先跑N,然后左指针在和右指针开始同步向前。
当右指针到达末尾时:
left.next = left.next.next即可!
这里需要注意,N的取值小于等于链表的长度。
这里就需要排除下当右指针跑了N后,已经超出链表,那么代表链表长度与N相等。
那倒数第N个数就是链表头,此时只需要返回head.next即可。
仔细分析,就是如此简单...
--------------------------
代码:
/**
* 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 slow = head;
ListNode fast = head;
while(n --> 0 ){ //fast先移动n+1步 等价于 for(int i = 0; i < n; i++) {fast = fast.next;}
fast = fast.next;
}
if (fast == null) return head.next; //N的取值小于等于链表的长度
while(fast.next!=null){//倒数第N个数就是链表头,此时只需要返回head.next即可
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return head;
}
}
09-05
1427
09-07
183