题目大意:从一个单链表中删除倒数第k个节点。
理解:为了方便处理删除第1个,也就是倒数第n(链表长度)个节点,在给定的链表中增加首节点h,从h开始处理,最后返回h.next就可以了。记住:删除倒数第k个,也就是找到倒数第(k+1)个节点;考虑到链表中只有一个节点的情形。
本题要求最好只扫描一遍链表,本人采取的方法是:两个指针,先让一个指针走k+1步,然后两个指针同时向后移动,直到先走的指针为空(即链表尾)。
实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null) return null;
if(head.next == null) return null;// only one node
ListNode h = new ListNode(1); // add a node as the head node
h.next = head;
ListNode p = h, q = h;
int t = n + 1;
while(t > 0) {
q = q.next;
t --;
}
while(q != null) {
q = q.next;
p = p.next;
}
q = p.next;
p.next = q.next;
return h.next;
}
}