02-线性结构3 Reversing Linked List(25 分)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤105) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address
is the position of the node, Data
is an integer, and Next
is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237
68237 6 -1
参考代码(未评分,仅结果正确):
#include<iostream>
using namespace std;
struct node1
{
int data;
int next;
};
struct node2
{
int address;
int data;
int nextaddr;
struct node2*next;
};
void attach(int a, int b, int c,node2 **rear)
{
node2 *p = new node2;
p->address = a;
p->data = b;
p->nextaddr = c;
p->next = NULL;
(*rear)->next = p;
*rear = p;
}
int main()
{
int addr, n,k;
int a, b, c;
node1 sss[100000];
cin >> addr >> n >> k;
while (n--)
{
cin >> a >> b >> c;
sss[a].data = b;
sss[a].next = c;
}
int p = addr;
node2 *rear;
node2 *t;
node2 *head = new node2;
head->next = NULL;
rear = head;
while (p != -1)
{
attach(p, sss[p].data, sss[p].next, &rear);
p = sss[p].next;
}
node2 *neww, *oldd, *tempp;
neww = head->next;
oldd =neww->next;
while((k--)-1)
{
tempp = oldd->next;
oldd->next = neww;
neww = oldd;
oldd = tempp;
}
head->next->next = oldd;
head->next = neww;
t = head;
head = head->next;
delete t;
while(head != NULL)
{
if (head->next != NULL)
{
cout << head->address << " " << head->data << " " << head->next->address << endl;
}
else
cout << head->address << " " << head->data << " " << "-1" << endl;
head =head->next;
}
system("pause");
return 0;
}
最初难点在于如何将所输入的数据存储于一个单链表中,本代码开辟了一个非常大的数组,用于存储较少的数据,造成了浪费。应该还能继续优化,不使用数组存储输入的数据。目前代码还需优化。
更新:上面的代码是错的,满分在此:
https://blog.youkuaiyun.com/wss123wsj/article/details/82153599