红桃J

用心写好每行完美的代码,远比写一堆更有价值

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

这个题如果按照正常想法,一般是两边遍历,第一遍是计算链表的长度;然后确定倒数第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     };

 

posted on 2015-04-13 15:20  红桃J  阅读(120)  评论(0编辑  收藏  举报