将带头节点的单链表逆置
时间: 2024-09-25 19:07:07 浏览: 35
将带头节点的单链表逆置是指将链表中的元素顺序反转,使得原来的头节点变成最后一个节点,而原本的尾节点成为新的头节点。这里提供一种常见的递归法实现:
1. 定义基本情况:如果链表只有一个节点,那么无需操作,直接返回当前节点。
2. 递归步骤:对于非空链表,将其分为两部分,头部(head.next)和剩余的部分(head),然后递归地逆置剩余部分。
3. 联接反转后的头部和原头部:最后将剩余部分的头(即原尾部)接到原始头部之后。
以下是Python代码示例:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseList(head):
if head is None or head.next is None:
return head
# 递归反转后半部分
new_head = reverseList(head.next)
# 将后半部分的头连接到原头部的尾部
head.next.next = head
head.next = None
return new_head
```
相关问题
将不带头结点的单链表逆置
好的,我可以为您提供一个简单的算法来将不带头结点的单链表逆置。具体的实现方法如下:
1. 从原链表的头结点开始,定义三个指针pre、p和next,其中pre指向NULL,p指向头结点,next指向p的下一个结点。
2. 反复执行下列操作,直到p指向NULL:
(1) 将p的下一个结点指向pre,即p->next=pre;
(2) 将pre向右移动,即pre=p;
(3) 将p向右移动,即p=next;
(4) 将next向右移动,即next=p->next;
3. 最后将原链表的尾结点指向NULL,并将逆置后的链表的头结点指向原链表的尾结点。
下面是具体的代码实现:
void ReverseList(Node* head) {
Node* pre = NULL;
Node* p = head;
Node* next = p->next;
while (p != NULL) {
p->next = pre;
pre = p;
p = next;
if (next != NULL) {
next = next->next;
}
}
head->next = NULL;
head = pre;
}
希望我的回答对您有所帮助,如果您有其他问题,也欢迎随时提出。
带头结点单链表就地逆置
很高兴为您解答关于带头结点单链表就地逆置的问题。带头结点单链表的就地逆置可以通过从首节点开始反转每一个节点的指向,直到链表末尾完成。这里给出一个简单实现的C++代码:
```C++
#include<iostream>
using namespace std;
class ListNode{
public:
int val;
ListNode* next;
ListNode(){}
ListNode(int x): val(x), next(NULL){}
};
ListNode* reverseList(ListNode* head){
if(head==NULL || head->next==NULL) return head;
ListNode* pre = head;
ListNode* cur = head->next;
ListNode* nxt;
pre->next = NULL;
while(cur!=NULL){
nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
int main(){
int n;
cin>>n;
ListNode* head = new ListNode(0);
ListNode* p = head;
for(int i=0;i<n;i++){
int x; cin>>x;
ListNode* node = new ListNode(x);
p->next = node;
p = p->next;
}
head = reverseList(head);
p = head->next;
while(p!=NULL){
cout<<p->val<<" ";
p = p->next;
}
cout<<endl;
return 0;
}
```
该程序首先定义了一个ListNode类作为单链表的节点,然后定义了一个reverseList函数对带头结点的链表进行就地逆置。在main函数中,程序首先读入链表的长度n以及每个节点的值,然后通过一个循环将链表构建完成。接下来,我们对链表进行就地逆置,最后按照逆序输出每个节点的值。希望我的回答能够帮助到您,如有疑问,请随时追问。
阅读全文