把一个带头结点的单链表的倒置
时间: 2023-10-19 17:11:11 浏览: 89
可以通过迭代或递归的方式来实现单链表的倒置。以下是迭代的方法:
```
void reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr != nullptr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head = prev; // 最后prev指向原链表的最后一个结点,即新链表的头结点
}
```
其中,`prev`指向新链表的尾结点,`curr`指向原链表的当前结点,`next`表示原链表中`curr`的下一个结点。每次将`curr`的`next`指针指向`prev`,然后将`prev`和`curr`都向后移动一位,直到`curr`为空,此时新链表的头结点就是`prev`。
如果要进行递归实现,可以采用类似于归并排序的思想,将链表不断拆分为更小的子链表,然后对子链表进行倒置,最后将所有子链表的倒置结果合并。具体实现可以参考以下代码:
```
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* tail = head->next;
ListNode* newHead = reverseList(head->next);
tail->next = head;
head->next = nullptr;
return newHead;
}
```
其中,`head`为当前子链表的头结点,`tail`为当前子链表的尾结点。递归结束条件是当前子链表为空或只有一个结点,此时返回头结点即可。在递归返回时,将当前子链表的尾结点的`next`指向当前子链表的头结点,然后将头结点的`next`设为`nullptr`,这样就完成了单链表的倒置。
阅读全文