双向循环链表的就地逆置
时间: 2023-07-22 13:10:15 浏览: 179
算法步骤如下:
1. 定义三个指针:p、q、r,分别指向头结点、第一个结点和第二个结点。
2. 如果链表为空或只有一个结点,则直接返回。
3. 否则,将p指向头结点,q指向第一个结点,r指向第二个结点。
4. 将q的next指针指向p,即将第一个结点的next指向头结点。
5. 将p指向q,q指向r,r指向r的next,即将三个指针依次向后移动一个结点。
6. 重复步骤4和步骤5,直到r指向NULL,即链表的末尾。
7. 将头结点的next指针指向p,即将头结点的next指向原链表的最后一个结点,完成链表的就地逆置。
代码实现如下:
void reverseList(LinkList &L) {
if (L == NULL || L->next == NULL) {
return;
}
ListNode *p = L, *q = L->next, *r = q->next;
p->next = NULL;
while (r != NULL) {
q->next = p;
p = q;
q = r;
r = r->next;
}
q->next = p;
L->next = q;
}
相关问题
循环单链表就地逆置
循环单链表就地逆置的步骤如下:
1. 判断链表是否为空,若为空则直接返回。
2. 定义三个指针pre、p、succ,分别指向链表的前一个节点、当前节点和后一个节点。
3. 将p指向第一个节点,pre指向最后一个节点。
4. 循环遍历链表,直到p指向pre,每次将p的后继指针指向pre,并将p、pre和succ分别向前移动一个节点。
5. 当p指向pre时,将p的后继指针指向pre,并将p、pre和succ分别向前移动一个节点。
6. 最后将链表的头节点指向pre,完成链表的就地逆置。
下面是 C++ 代码实现:
```
void reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return;
}
ListNode* pre = head;
ListNode* p = head->next;
ListNode* succ = p->next;
while (p != head) {
p->next = pre;
pre = p;
p = succ;
succ = succ->next;
}
p->next = pre;
head->next = succ;
head = pre;
}
```
链表的就地逆置算法结论
链表的就地逆置算法结论是:通过修改节点的指针,将链表逆置。
具体的就地逆置算法如下:
1. 定义三个指针:prev指向当前节点的前一个节点,cur指向当前节点,next指向当前节点的下一个节点。
2. 初始化prev为NULL,cur为链表的头节点。
3. 遍历链表,直到cur为NULL:
- 先保存cur的下一个节点为next。
- 将cur的指针指向prev,完成节点的反转。
- 将prev指向cur,cur指向next。
4. 遍历结束后,将链表的头节点指向prev,完成逆置。