题目
解题1:
遍历一遍得到链表的长度,再遍历一遍得到倒数第n个节点的前驱,进行删除 这个方法要非常注意的一点是要保证cur->next = cur->next->next;
在任何情况下都要成立:当链表只有一个节点的时候,如果cur = head是不成立的,所以需要加一个哑节点,cur从哑节点开始,这样才能保证这个删节点的动作不出错
class Solution {
public:
int getLength(ListNode* head)
{
int length = 0;
while(head)
{
length++;
head = head->next;
}
return length;
}
ListNode* removeNthFromEnd(ListNode* head, int n) {
//先走一遍获取长度 再删除第n个节点
int len = getLength(head);
ListNode* dummy = new ListNode(0, head);//指向head 防止head为空依然返回head的情况
ListNode* cur = dummy;
for(int i = 1; i<len-n+1;++i)
{
cur= cur->next;
}
cur->next = cur->next->next;
ListNode* ans = dummy->next;
delete dummy;
return ans;
}
};
解题2
压栈 弹出第n个后的top就是链表倒数第n个
解题3
弄明白到底第一个指针先走几步, 从哪里开始走