要求
- 给定一个链表,删除倒数第n个节点
示例
- 1->2->3->4->5->NULL , n=2
- 1->2->3->5
边界
- n是从0还是从1计
- n不合法,负数或者大于链表长度如何处理
思路
- 遍历一遍计算链表长度,再遍历一遍删除倒数第n个节点
- 使用两个指针同时移动,找到待删除节点的前一个节点
实现
1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(int x) : val(x), next(NULL) {} 5 }; 6 7 class Solution { 8 public: 9 ListNode* removeNthFromEnd(ListNode* head, int n) { 10 11 assert( n>=0 ); 12 ListNode* dummyHead = new ListNode(0); 13 dummyHead->next = head; 14 15 ListNode* p = dummyHead; 16 ListNode* q = dummyHead; 17 for( int i = 0 ; i < n + 1 ; i ++ ){ 18 assert( q ); 19 q = q->next; 20 } 21 22 while( q != NULL){ 23 p = p->next; 24 q = q->next; 25 } 26 27 ListNode* delNode = p->next; 28 p->next = delNode->next; 29 delete delNode; 30 31 ListNode* retNode = dummyHead->next; 32 delete dummyHead; 33 34 return retNode; 35 } 36 };
相关
- 61 Rotate List
- 143 Reorder List
- 234 Palindrome Linked List