80分双向环形链表求调

P1563 [NOIP2016 提高组] 玩具谜题

``` #include <bits/stdc++.h> using namespace std; struct LinkList { int id; int direction; string name; LinkList* leftPointer; LinkList* rightPointer; }; int main() { int n, m; cin >> n >> m; LinkList* firstNode = nullptr; LinkList* lastNode = nullptr; int directionList[100005] = {0}; for (int i = 0; i < n; i++) { LinkList* newNode = new LinkList; newNode->id = i; cin >> newNode->direction >> newNode->name; directionList[i] = newNode->direction; if (firstNode == nullptr) { firstNode = newNode; lastNode = newNode; newNode->leftPointer = newNode; newNode->rightPointer = newNode; } else { newNode->leftPointer = lastNode; newNode->rightPointer = firstNode; lastNode->rightPointer = newNode; firstNode->leftPointer = newNode; lastNode = newNode; } } LinkList* glassGuy = firstNode; int hand; int num; int rightMove = 0; for (int i = 0; i < m; i++) { cin >> hand >> num; if (directionList[rightMove] == hand) /* leftward count num */ { /* for (int j = 0; j < num % n; j++) { glassGuy = glassGuy -> leftPointer; } */ rightMove -= num; rightMove += n; rightMove %= n; } else /* rightward count num */ { /* for (int j = 0; j < num % n; j++) { glassGuy = glassGuy -> rightPointer; } */ rightMove += num; rightMove %= n; } } if (rightMove > 0) { while (rightMove--) { glassGuy = glassGuy -> rightPointer; } } else { while (rightMove++) { glassGuy = glassGuy -> leftPointer; } } cout << glassGuy->name; /* LinkList* current = firstNode; // free the memory do { LinkList* next = current->rightPointer; delete current; current = next; } while (current != firstNode); */ return 0; } ``` 已经自我完善,谢谢,虽然这样做好像和链表没啥关系了,不过就这样吧
by Kuroibuta @ 2024-01-17 19:44:31


|