小苹果¥24.9红苹果¥29大苹果¥48大红苹果¥901.创建单链表L,并将上述苹果的价格作为参数创建相应的结点,并按顺序链入到L中。2.从第二个结点开始直到最后一个结点,将其按顺序通过头插法插入到第一个结点之前,最后完成单链表的转置。3.输出就地转置后的单链表L
时间: 2024-10-21 13:11:54 浏览: 38
首先,让我们逐步构建这个过程:
1. 创建单链表L并添加价格节点:
- 我们可以定义一个`Node`结构体,包含一个整数值表示苹果价格和一个指向下一个节点的指针。
- 然后,我们可以初始化一个`ListNode`类型的头结点`head`设为空。
- 对于每个价格,我们创建一个新的`Node`,存储价格数据,然后将其设置为当前的头结点,同时更新头结点指向新创建的节点。
```csharp
struct ListNode {
int price;
ListNode* next;
};
ListNode* createList(int prices[], int n) {
ListNode* head = new ListNode();
head->price = prices[0];
head->next = nullptr;
for (int i = 1; i < n; ++i) {
ListNode* newNode = new ListNode();
newNode->price = prices[i];
newNode->next = head->next;
head->next = newNode;
}
return head;
}
```
2. 单链表转置:
- 使用头插法,从第二个节点开始遍历原链表,把每个节点插入到链表头部。
- 遇到每个节点,先保存其下一个节点,然后将其插入到头结点之后,再恢复原下一个节点。
```csharp
void transpose(ListNode*& head) {
if (!head || !head->next) {
return;
}
ListNode* prev = nullptr;
ListNode* current = head->next;
while (current != nullptr) {
ListNode* nextTemp = current->next;
current->next = head;
prev = current;
current = nextTemp;
}
head->next = nullptr;
if (prev) {
prev->next = current;
}
}
```
3. 输出转置后的链表:
- 转置完成后,直接遍历新的头结点`head`即可。
```csharp
void printList(ListNode* node) {
while (node) {
cout << node->price << " ";
node = node->next;
}
cout << endl;
}
// 示例:
int prices[] = {24.9, 29, 48, 90};
ListNode* list = createList(prices, sizeof(prices) / sizeof(prices[0]));
transpose(list);
printList(list);
```
阅读全文