标签:col list 除了 一个 -- 说明 pre lag 原因
题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗?
代码实现:(暴力解决)
class Solution { public: ListNode* removeNthFromEnd(ListNode *head, int n) { ListNode *dummyNode = new ListNode(0); dummyNode->next = head; ListNode* p = head; int size = 0; while(p != NULL) { p = p-> next; size++; } int ans = 0; // ListNode* flag ; p = dummyNode; while(p != NULL) { if(ans + n == size ) { ListNode* k = p-> next; p -> next = k -> next ; // p = k; delete(k); } p = p -> next; ans++; } return dummyNode -> next ; // return head; } };
做题总结:
1:要先引入一个哑结点,这道题中的哑结点就是dummyNode ,是在head之前附加了一个节点,原因是如果要删除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; return dummyHead->next; } };
启示:
这种解法是思路上的启发,运用了哑结点和双指针p和q,将q移动到距离p 有n 的节点位置上,然后两指针保持距离一起移动,直到q到NULL位置,而p指向的节点的后一个节点就是要删除的节点。
标签:col list 除了 一个 -- 说明 pre lag 原因
原文地址:https://www.cnblogs.com/wtzmz/p/13376472.html