LinkList reverse(LinkList list) { PNode p, r, q=list; if (q==NULL || q->link==NULL) return list; p=NULL; while(q!=NULL) { r=q; q=q->link; r->link = p; p=r; } list =p; return list; }
时间: 2024-04-16 10:27:05 浏览: 53
这是一个反转链表的函数。函数的参数为一个链表(LinkList),返回值也是一个链表。函数的实现如下:
```c
LinkList reverse(LinkList list)
{
PNode p, r, q = list;
if (q == NULL || q->link == NULL)
return list;
p = NULL;
while (q != NULL)
{
r = q;
q = q->link;
r->link = p;
p = r;
}
list = p;
return list;
}
```
该函数通过使用三个指针p、r和q来反转链表。初始时,p指向NULL,q指向链表的头节点,r指向q。然后在循环中,通过将r的link指向p,实现反转操作。每次循环结束后,将q指向下一个节点,r指向当前节点,p指向r,继续下一次循环。最后将反转后的链表头节点赋值给list,并返回list。
请注意这段代码可能存在错误或不完整之处,请自行检查和调试。
相关问题
LinkList MaxP( LinkList L){ if(L==NULL||L->next==NULL)return NULL; else{ LinkList p; LinkList MAX; p=L->next; MAX=p; while(p){ if(p->data>MAX->data){ MAX=p; } p=p->next; } return MAX; } }请将里面的create函数完善
好的,这里是完整的代码示例,包括 `create` 函数的实现:
```c++
#include <iostream>
using namespace std;
struct ListNode {
int data;
ListNode* next;
ListNode(int x) : data(x), next(NULL) {}
};
typedef ListNode* LinkList;
LinkList create() {
int n;
cin >> n;
LinkList head = NULL, tail = NULL;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
ListNode* node = new ListNode(x);
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
LinkList MaxP(LinkList L) {
if (L == NULL || L->next == NULL) return NULL;
else {
LinkList p = L->next;
LinkList MAX = p;
while (p) {
if (p->data > MAX->data) {
MAX = p;
}
p = p->next;
}
return MAX;
}
}
int main() {
LinkList L = create();
LinkList max_node = MaxP(L);
if (max_node == NULL) {
cout << "No answer!" << endl;
} else {
cout << max_node->data << endl;
}
return 0;
}
```
`create` 函数中,我们先输入一个整数 `n` 表示链表节点数,然后依次输入每个节点的值,并将其插入链表尾部。函数返回链表的头指针 `head`。
`MaxP` 函数中,我们遍历整个链表,找到最大值所在的节点,并返回该节点的指针。如果链表为空或只有一个节点,则直接返回 `NULL`。
最后在 `main` 函数中,我们调用 `create` 函数创建链表,然后调用 `MaxP` 函数找到最大值所在的节点,并输出其值。如果链表为空,则输出 "No answer!"。
void push_tail(struct LinkList* list, struct Node* temp) { temp->pro = list->head; temp->next = list->tail; list->tail->pro = temp; list->head->next = temp; list->head = temp; }优化一下这个代码,使用双向链表的头插法
void push_head(struct LinkList* list, struct Node* temp) {
temp->next = list->head->next;
temp->pro = list->head;
list->head->next->pro = temp;
list->head->next = temp;
list->tail = (list->tail == list->head) ? temp : list->tail;
}
这是使用双向链表头插法的代码。需要注意的是,当链表为空时,头尾节点都需要指向新插入的节点。因此,需要判断一下链表是否为空。