c笔试题-删除链表的倒数第 n 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

 

* struct ListNode {
* int val;
* struct ListNode *next;
* };
 
这段代码运行结果:
输入[1,2,3,4,5] 2
输出[1,2,3,4]
预期结果[1,2,3,5]
请指出代码的所有问题
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
struct ListNode* pCurrent=head;
struct ListNode* pFast=head;
 
struct ListNode* pHead = head;
for(int i=0;i<n;i++)
pFast= pFast->next;
 
while(pFast!=NULL)
{
pFast=pFast->next;
pCurrent=pCurrent->next;
}
pCurrent->next = pCurrent->next->next;
return pHead;
}
 
分析:

//由于我们需要找到倒数第 nn 个节点,因此我们可以使用两个指针

//first 和second 同时对链表进行遍历,并且first 比 second 超前 n 个节点。

//当 first 遍历到链表的末尾时,second 就恰好处于倒数第 n 个节点。

//如果得到的是要删除的节点的前驱节点,则删除动作会更方便

//为了更方便地删除节点,初始时申请一个哑节点,它的next就是head

 

最后答案:
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val = 0, dummy->next = head;
struct ListNode* pSecond=dummy;
struct ListNode* pFisrt=head;
pSecond = dummy;

struct ListNode* pHead = head;
for(int i=0;i<n;++i)
pFisrt= pFisrt->next;
 
while(pFisrt!=NULL)
{
pFisrt=pFisrt->next;
pSecond=pSecond->next;
}
pSecond->next = pSecond->next->next;
struct ListNode* result = dummy->next;
free(dummy);
return result;
}
 
方法二:
先求链表长度,再遍历到len-n-1后,删除其后继节点。
int getLength(struct ListNode* head)
{
int i;
while(head!=NULL)
{
head=head->next;
i++;
}
return i;
}

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* pCurrent=head;
int len=getLength(head);
for(int i=0;i<len-n-1;i++)
pCurrent=pCurrent->next;

pCurrent->next=pCurrent->next->next;
return head;
}
 
最后答案:
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
//struct ListNode* dummy=(ListNode*)malloc(sizeof(stuct ListNode));
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val=0;
dummy->next=head;

struct ListNode* pCurrent=dummy;
int len=getLength(head);
for(int i=0;i<len-n;i++){
pCurrent=pCurrent->next;
}

pCurrent->next=pCurrent->next->next;
free(dummy);
return head;
}
posted @ 2022-03-19 06:15  foreverv  阅读(52)  评论(0)    收藏  举报