题目描述
given a linked list,remove the n th node from the end of list and return its head.
for example,given linked list:1->2->3->4->5,and n=2,output:
1->2->3->5.
Note:
given n will always be valid,Try to do this in one pass.
题目要求分析:
(1)本题是让我们移除链表的倒数第 n 个节点,限定n一定是有效的,n不会大于链表长度。
(2)题目要求我们遍历一遍解决问题。
解题思路:
代码实现:
//删除倒数第n个节点
//定义链表结构
struct ListNode
{
int value;
ListNode *next;
ListNode(int x)
:value(x)
, next(NULL)
{}
};
class Solution{
public:
ListNode* remove_n_th_from_end(ListNode* head, int n)
{
//如果链表只有一个节点,返回NULL
if (head->next == NULL)
return NULL;
//分别定义两个指针指向头结点
ListNode*prev = head;
ListNode*cur = head;
while (n)
{
cur = cur->next;
n -= 1;
}
//如果cur向后走n步为空,则说明应该删除第一个节点,所以返回head->next
if (cur == NULL)
return head->next;
//cur指针走到最后一个节点
//prev也走到了应该删除节点的前一个节点了
while (cur->next)
{
cur = cur->next;
prev = prev->next;
}
//跳过要删除的节点,并返回头结点
prev->next = prev->next->next;
return head;
}
};
测试代码:
//打印链表
void print_list(ListNode*head)
{
while (head!=NULL)
{
cout << head->value << " ";
head = head->next;
}
cout << endl;
}
//测试
int main()
{
cout << "请输入链表长度len:"<<endl;
int len;
cin >> len;
cout << "请输入链表: ";
ListNode*head = NULL;
ListNode*p;
int data;
for (int i = 0; i < len; ++i)
{
cin >> data;
if (head == NULL)
{
head = (ListNode*)malloc(sizeof(ListNode));
head->value = data;
p = head;
}
else
{
p->next = (ListNode*)malloc(sizeof(ListNode));
p = p->next;
p->value = data;
}
}
p->next = NULL;
Solution L;
cout << "你想删除的倒数第N个节点:";
int n;
cin >> n;
ListNode* ret = L.remove_n_th_from_end(head, n);
print_list(ret);
system("pause");
return 0;
}
实现结果: