链表头插法、尾插法以及链表的原地逆置算法

本文介绍了如何初始化带有头结点的链表,以及使用头插法和尾插法进行节点插入。重点讨论了链表的原地逆置算法,通过头插法实现,从第二个元素开始遍历,利用额外指针保存断开链接的节点,以达到逆置链表的效果。
摘要由CSDN通过智能技术生成

带有头结点的链表的初始化、头插法、尾插法,以及链表的原地逆置;
原地逆置思想:(头插法)
从第一个元素后断开链表,这是由于第一个元素不需要经过头插,从第二个元素开始遍历头插法插入他们之间,第一个元素自然是最后一个。省了一个插入,而且理解简单由于遍历元素时会断开这个元素的链接,断开后将无法遍历后一个元素,所以我们用另一个指针保存它。

#include<iostream>
#include<stdio.h>
typedef struct LinkList{
   
 struct LinkList *next;
 int data;
 int length;
}Linklist,*link;
link Insert_HList(link &head){
      //按照自己的想法选择插入方法
 int chooes = 0;
 printf_s("请选择尾插(按1)或头插(按2):\n");
 scanf_s("%d", &chooes);
 int data;
 head = (LinkList*
头插法是一种常见的链表逆置算法,它通过不断将当前节点入到已反转链表部来达到逆序的效果。以下是使用C++实现头插法链表逆置的基本步骤: ```cpp #include <iostream> // 定义链表节点结构 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 使用头插法逆置链表 ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; // 初始化前驱指针为空 ListNode* current = head; // 初始化当前指针指向结点 while (current != nullptr) { // 当链表非空时 ListNode* nextTemp = current->next; // 保存下一个节点 current->next = prev; // 将当前节点的next指向前驱 prev = current; // 更新前驱指针为当前节点 current = nextTemp; // 移动当前指针到下一个节点 } return prev; // 返回新的节点,即原链表部 } // 打印链表 void printList(ListNode* head) { ListNode* temp = head; while (temp != nullptr) { std::cout << temp->val << " -> "; temp = temp->next; } std::cout << "nullptr" << std::endl; } int main() { // 创建一个示例链表 ListNode* list = new ListNode(1); list->next = new ListNode(2); list->next->next = new ListNode(3); list->next->next->next = new ListNode(4); std::cout << "Original List:" << std::endl; printList(list); // 逆置链表 list = reverseList(list); std::cout << "Reversed List:" << std::endl; printList(list); return 0; } ``` 在这个例子中,`reverseList`函数接收一个链表节点作为输入,通过遍历链表并将每个节点的next指针指向前一个节点,实现了链表的逆序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值