问题描述 :
使用带头结点的单链表编程:
一群学生排成一行,输入一个位置,将该位置的学生移除。
第一个学生的位置为1,第n个学生的位置为n。
输入说明 :
第一行输入学生信息:
第一个整数n(0<=n<=100),表示共有n个学生,其后有n个整数,表示n个学生的学号
第二行及以后各行,每行输入一个整数,表示要移除的学生位置。
输出说明 :
每次移除一个学生后,在一行里输出完整的学号序列,以head开头,以tail结尾,学号之间以“-->”分隔(参见范例)。
如果需要移除学生的位置不合法,则输出“invalid”(不包括双引号)
输入范例 :
3 4 5 10
10
3
0
2
1
输出范例 :
invalid
head-->4-->5-->tail
invalid
head-->4-->tail
head-->tail
题解:
首先要彻底理解链表的延长,切割,链接。然后就可以轻松秒杀。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
struct ListNode
{
int num;
ListNode* next = NULL;
};
int lenght(ListNode* head)
{
ListNode* p1;
if (head == NULL)
return 0;
p1 = head;
int l = 0;
while (1)
{
l++;
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
return l;
}
void output(ListNode* head)
{
ListNode* p1;
p1 = head;
cout << "head-->";
while (1)
{
cout << p1->num << "-->";
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
cout << "tail";
cout << endl;
return ;
}
int main()
{
int i, j;
ListNode* head, * p1, * p2;
head = NULL;
p2 = NULL;
int n, where, num;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> num;
p1 = new ListNode;
p1->num = num;
if (i == 0)
head = p1;
else
p2->next = p1;
p2 = p1;
}
//p2->next = NULL;
//cout << lenght(head) << endl;
while (cin >> where)
{
if (lenght(head) == 0)
{
cout << "invalid" << endl;
continue;
}
if (where<1 || where>lenght(head))
{
cout << "invalid" << endl;
continue;
}
if (where == 1 && lenght(head) == 1)
{
cout << "head-->tail" << endl;
head = NULL;
continue;
}
p1 = head;
int t = 0;
while (1)
{
t++;
if (t == where-1)
{
p1->next = p1->next->next;
output(head);
continue;
}
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
}
return 0;
}