示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
如上,正常思路:链表的长度———>要删除的位置的前一个———>删除
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null)
return head;
ListNode temp = head;
int length = 1;
//统计链表个数
while(temp.next != null){
temp = temp.next;
length++;
}
//计算位置
int pos = length - n + 1;
//删除结点
if(pos == 1)
return head.next;
temp = head;
for(int i = 1; i < pos - 1; i++)
temp =temp.next;
//删除结点
temp.next = temp.next.next;
return head;
}
}
进阶: 只扫描一次 双指针!!!一个fast一个low,一定要注意数字!!!绕来绕去
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// if(head == null)
// return head;
// ListNode temp = head;
// int length = 1;
// //统计链表个数
// while(temp.next != null){
// temp = temp.next;
// length++;
// }
// //计算位置
// int pos = length - n + 1;
// //删除结点
// if(pos == 1)
// return head.next;
// temp = head;
// for(int i = 1; i < pos - 1; i++)
// temp =temp.next;
// //删除结点
// temp.next = temp.next.next;
// return head;
//指针指来指去指不清
if(head == null)
return head;
ListNode fast = head;
ListNode low = head;
for(int i = 0; i < n; i++)
fast = fast.next;
if(fast == null)
return head.next;
while(fast.next != null){
fast = fast.next;
low =low.next;
}
low.next = low.next.next;
return head;
}
}