链表题。很简单但是debug了非常久。
愚蠢如我...把所有地址存在数组里。空间复杂度...
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *p=head,*q; ListNode *s[100000]; int m=0; while(p){ s[m]=p;m++; p=p->next; } if (m==n) return head->next; if(n==1) (*s[m-2]).next=NULL; else { p=s[m-n-1]; q=p->next; (*p).next=(*q).next; } return head; } };
非常巧妙的方法,保持两个指针差n个位置,使后面的指针指向最后一个,前面的指针即为倒数第n.
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head->next) return NULL; ListNode *pre = head; ListNode *cur = head; for(int i = 0;i<n;i++) cur = cur->next; if(!cur) return head->next; while(cur->next){ cur = cur->next; pre = pre->next; } pre->next = pre->next->next; return head; } };
本文探讨了链表中删除倒数第N个节点的问题,提供了两种解决方案:一是使用数组存储所有节点地址,二是采用双指针技巧,保持两指针间固定距离,巧妙实现目标节点定位及删除。
635

被折叠的 条评论
为什么被折叠?



