PAT甲级 1133. Splitting A Linked List (25)

来源:互联网 发布:java在线支付 编辑:程序博客网 时间:2024/06/07 16:24

Given a singly linked list, you are supposed to rearrange its elements so that all the negative values appear before all of the non-negatives, and all the values in [0, K] appear before all those greater than K. The order of the elements inside each class must not be changed. For example, given the list being 18→7→-4→0→5→-6→10→11→-2 and K being 10, you must output -4→-6→-2→7→0→5→10→18→11.

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 (<=1000). 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 in [-105, 105], and Next is the position of the next node. It is guaranteed that the list is not empty.

Output Specification:

For each case, output in order (from beginning to the end of the list) the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:
00100 9 1023333 10 2777700000 0 9999900100 18 1230968237 -6 2333333218 -4 0000048652 -2 -199999 5 6823727777 11 4865212309 7 33218
Sample Output:
33218 -4 6823768237 -6 4865248652 -2 1230912309 7 0000000000 0 9999999999 5 2333323333 10 0010000100 18 2777727777 11 -1
三次遍历所有输入即可保证相对顺序与原先一样,然后依次把符合条件的存入结果链表中。

#include#includeusing namespace std;struct node {int data, next;node() { data = 1000000; next = -1; }};string printzero(int num){if (num == 0)return "0000";if (num == -1)return "";string s = "";while (num<10000){s.append("0");num *= 10;}return s;}int main(){int start, N, K, resultnum = 0;node * list = new node[100002];node * result = new node[100002];cin >> start >> N >> K;for (int i = 0; i> adress;cin >> list[adress].data >> list[adress].next;}int lastadress = -1, adress = start, resultstart = -1;while (adress != -1){if (list[adress].data<0){result[adress] = list[adress];resultnum++;if (resultnum == 1)resultstart = adress;elseresult[lastadress].next = adress;lastadress = adress;}adress = list[adress].next;}adress = start;while (adress != -1){if (list[adress].data >= 0 && list[adress].data <= K){result[adress] = list[adress];resultnum++;if (resultnum == 1)resultstart = adress;elseresult[lastadress].next = adress;lastadress = adress;}adress = list[adress].next;}adress = start;while (adress != -1){if (list[adress].data>K){result[adress] = list[adress];resultnum++;if (resultnum == 1)resultstart = adress;elseresult[lastadress].next = adress;lastadress = adress;}adress = list[adress].next;}result[lastadress].next = -1;adress = resultstart;while (adress != -1){cout << printzero(adress) << adress << " " << result[adress].data << " " << printzero(result[adress].next) << result[adress].next << endl;adress = result[adress].next;}return 0;}
原创粉丝点击