问题:
思路
只用一次扫描,考虑双指针
如果删除的不是头节点,例如删除长度为5的链表的倒数第3个节点,思路构造图如下:
step1:两个指针,都指向头节点
step2:让右指针远离左指针 n 个节点
step3:左右指针依次向右移动1个节点
如果右指针的下一个为空,则删除做指针的下一个
//如表格所示,1代表左边的指针,3代表右指针
1 | 2 | 3 | 4 | 5 | ||
step1 | 1,3 | |||||
step2 | 1 | 3 | ||||
step3 | 1 | 3 | ||||
删 |
如果删除的是头指针,,例如删除长度为5的链表的倒数第5个节点
step1:两个指针,都指向头节点
step2:让右指针远离左指针 n 个节点
这里不需要step3的移动,右指针就已经指向null,,所以左指针也走过了,即删除左指针所在节点
//1表示做指针,5表示右指针
1 | 2 | 3 | 4 | 5 | ||
step1 | 1,5 | |||||
step2 | 1 | 5 | ||||
删 |
代码:
/**
* 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 left = head;
ListNode right = head;
for(int i = 1;i<=n;i++){
right = right.next;
}
while(right != null && right.next!=null){
left = left.next;
right = right.next;
}
if(right == null){
head = left.next;
}else{
left.next = left.next.next;
}
return head;
}
}
效果: