单链表的建立,反序,插入,删除

本文详细介绍了使用C语言创建、打印、反转、追加到末尾和删除节点的链表操作过程。
#include <stdio.h>
#include <malloc.h>
typedef struct _node
{
int data;
struct _node *next;
}Node,*pNode;
pNode headnode = NULL;
void creatnode()
{
pNode current,head;
int temp = 0;
if(headnode == NULL)
{
headnode = (pNode)malloc(sizeof(Node));
printf("sizeof(_node)=%d\n",sizeof(Node));
}
else
{
printf("create bad\n");
return;
}
if(headnode == NULL)
{
printf("malloc error\n");
return;
}
else
{
headnode->data = 0;
}
head = headnode;
head->next = NULL;
for(temp = 0;temp < 4;temp ++)
{
current = (pNode)malloc(sizeof(Node));
if(!current)
{
printf("current malloc error\n");
return;
}
current->data = temp;
current->next = NULL;
head->next = current;
headnode->data ++;
head = current;
}


}
void printNode(pNode pnode)
{
pNode tempnode;
tempnode = pnode;
while(tempnode)
{
printf("node->data=%d\n",tempnode->data);
//printf("node addr=%x,next addr=%x\n",(unsigned int)tempnode,(unsigned int)tempnode->next);
tempnode = tempnode->next;
}
}
void invertNode(pNode pnode)
{
pNode prenode = NULL;
pNode current;
pNode pnext;
current = pnode;
while(current)
{
pnext=current->next;
if(pnext == NULL)
headnode = current;
current->next = prenode;
prenode = current;
current = pnext;
}
}
void appendToEnd(pNode pnode)
{
pNode tempnode = headnode;
while(tempnode)
{
tempnode = tempnode->next;
if(tempnode->next == NULL)
{
tempnode->next = pnode;
break;
}
}
}
void deleteNode(int data)
{
pNode tempnode = headnode;
pNode pnext = NULL;
if(tempnode->data == data)
{
headnode = headnode->next;
free(tempnode);
return;
}
while(tempnode)
{
pnext = tempnode->next;
if(pnext->data == data)
{
tempnode->next = pnext->next;
free(pnext);
break;
}
tempnode = pnext;
}
}
void main()
{
//pNode addnode = (pNode)malloc(sizeof(Node));
//addnode->next = NULL;
//addnode->data = 20;
creatnode();
printNode(headnode);
//invertNode(headnode);
//printNode(headnode);
//appendToEnd(addnode);
deleteNode(2);
printNode(headnode);
deleteNode(4);
printNode(headnode);
}
在C++中,你可以通过迭代或递归的方式来实现单链表的反转。这里是一个简单的迭代方法: ```cpp #include <iostream> // 定义链表节点结构体 struct ListNode { int val; // 节点值 ListNode* next; // 指向下一个节点的指针 ListNode(int x) : val(x), next(NULL) {} // 构造函数 }; // 反转链表的函数 ListNode* reverseList(ListNode* head) { if (head == nullptr || head->next == nullptr) { // 特殊情况处理:空链表或只有一个节点 return head; } ListNode* prev = nullptr; // 初始化前驱节点为nullptr ListNode* curr = head; // 当前节点指向头节点 while (curr != nullptr) { // 当当前节点非空 ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点 curr->next = prev; // 将当前节点的next指向前一个节点 prev = curr; // 更新前驱节点为当前节点 curr = nextTemp; // 移动当前节点到下一个 } return prev; // 返回新的头节点,即原链表的尾节点 } int main() { // 创建测试链表 ListNode* list = new ListNode(1); list->next = new ListNode(2); list->next->next = new ListNode(3); std::cout << "Original List: "; printList(list); // 自定义打印链表的方法 list = reverseList(list); std::cout << "Reversed List: "; printList(list); // 打印反转后的链表 delete list; return 0; } // 辅助函数:打印链表 void printList(ListNode* node) { while (node != nullptr) { std::cout << node->val << " -> "; node = node->next; } std::cout << "nullptr" << std::endl; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值