leetcode19_删除链表的倒数第N个节点
一、题目
二、分析
我最开始的想法是,先记录链表长度,然后确定对应节点的序号,然后删除,需要删除两个部分,空间复杂度为O(1),时间复杂度为O(2*n);
代码如下,需要注意如果删除节点出门在头节点的情况。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(head == NULL) return head; int size = 0; ListNode* pre = head; while( pre != NULL){ size++; pre = pre->next; } //查找对应元素,然后删除 int count = size - n; pre = head; if(count == 0){ return head->next; } size = 0; while(pre!=NULL){ count--; if(count==0){ ListNode* lat = pre->next; pre->next = lat->next; break; } pre = pre->next; } return head; } };
三、实例代码
例子想法只使用了一次遍历就完成了整个过程,使用了双节点
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummyHead = new ListNode(0); dummyHead->next = head; ListNode* p = dummyHead; ListNode* q = dummyHead; for( int i = 0 ; i < n + 1 ; i ++ ){ q = q->next; } while(q){ p = p->next; q = q->next; } ListNode* delNode = p->next; p->next = delNode->next; delete delNode; ListNode* retNode = dummyHead->next; delete dummyHead; return retNode; } };
纵一苇之所如,临万顷之茫然。