您的位置:首页 > Web前端 > Node.js

19. Remove Nth Node From End of List

2016-08-23 19:22 441 查看


C语言解法:先遍历一遍计算链表元素个数length,如果小于等于n则直接返回,大于n则删除第length-n元素的后一个元素并返回head。

#include<stdio.h>
#include<stdlib.h>
4000

struct ListNode {
int val;
struct ListNode *next;
};

struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
struct ListNode *p,*q;
int num,length;
p=head;
length=0;
while(p)
{
length++;
p=p->next;
}
if(length<n)
return head;
if(length==n)
return head->next;
num=1;
p=head;
while(p)
{
if((length-n)==num)
{
q=malloc(sizeof(struct ListNode));
q=p->next;
p->next=q->next;
free(q);
break;
}
p=p->next;
num++;
}
return head;
}
int main()
{
struct ListNode* L,*p,*q;
int N,M,i,number;
L=malloc(sizeof(struct ListNode));
scanf("%d",&number);
scanf("%d",&N);
L=NULL;
p=L;
for(i=0;i<N;i++)
{
scanf("%d",&M);
q=malloc(sizeof(struct ListNode));
q->val=M;
q->next=NULL;
if(NULL==L)
L=q;
else
p->next=q;
p=q;
}
L=removeNthFromEnd(L,number);
while(L)
{
printf("%d ",L->val);
L=L->next;
}
}


C++解法思想:用两个指针p,q,指针之间间隔为n,p为删除节点的前驱,当q指向链表最后时,删除 p->next就可以了

#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode *p,*q;
int i;
p=head;
q=head;
for(i=0;i<n;i++)//向右移n个,直接找从尾部开始数第n个数的前驱
{
if(q)
q=q->next;
else
return head;
}
if(q==NULL)
return head->next;
while(q->next)
{
q=q->next;
p=p->next;
}
p->next=p->next->next;
return head;
}
};
void main()
{
ListNode *L,*p,*q,*list;
int N,M,i,number;
Solution solve;
L= (ListNode*)malloc(sizeof(ListNode));
cin>>number;
cin>>N;
L=NULL;
p=L;
for(i=0;i<N;i++)
{
cin>>M;
q= (ListNode*)malloc(sizeof(ListNode));
q->val=M;
q->next=NULL;
if(NULL==L)
L=q;
else
p->next=q;
p=q;
}
list=solve.removeNthFromEnd(L,number);
while(list)
{
cout<<list->val<<' ';
list=list->next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: