这个题如果按照正常想法,一般是两边遍历,第一遍是计算链表的长度;然后确定倒数第n个节点的正序号,然后访问即可。
好一点的方法是找一个指针p指向头结点后的n+1个节点,然后同时对头结点和p向后移动,如果p=Null了,这时head指针就恰好指向倒数第n+1个节点。这里有个问题,假如n恰好等于链表的长度,显然这时head指针指向了head节点,并没有指向head节点的前驱,那代码中的这一句可以解决这个问题,即在没有到n+1判断就到了NUll即是这种情况。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *removeNthFromEnd(ListNode *head, int n) { 12 ListNode *end = head; 13 ListNode *F = head; 14 int i = 0; 15 while (end != NULL&&i<n+1) 16 { 17 end = end->next; 18 i++; 19 if (end == NULL&&i<n+1) 20 return head = head->next; 21 } 22 while (end != NULL) 23 { 24 head = head->next; 25 end = end->next; 26 } 27 head->next = head->next->next; 28 return F; 29 } 30 };