c语言单链表的逆置

单链表的逆置

 

方法一:头插

void Reverse(Node* plist) {
	assert(plist != NULL&&plist->next!=NULL);

	Node* p = plist->next;
	Node* q;
	plist->next = NULL;
	while (p != NULL) {
		q = p->next;
		p->next = plist->next;
		plist->next = p;
		p = q;
	}
}

方法二: 通过三个指针不借助头节点

定义三个指针分别指向头节点后的三个元素

再将 p->next =NULL;

进行循环

使q->next = p; 改变指针指向

再将p q r 三个指针同时向后移动

直至q为NULL 再将plist (头节点)指向p 即可

void Reverse1(Node* plist) {
	assert(plist != NULL && plist->next != NULL);
	Node* p = plist->next;
	Node* q = p->next;
	Node* r;
	p->next = NULL;
	while (q != NULL) {
		r = q->next;
		q->next = p;
		p = q;
		q = r;
	}
	plist->next = p;
}

单链表的逆置 (首元素节点与尾元素节点不变其余节点逆置)

单链表逆置的变种 :

这里采用方法一

定义四个节点,z保存 头节点和首元素节点

r节点保存要第二个元素节点的地址 

p 和 q节点进行头插操作

完整代码

void Reverse01(ListNode* plist) {  //首节点和尾节点不变
	//assert
	ListNode* z = plist->next;
	ListNode* p = z->next;
	ListNode* q=NULL;
	ListNode* r = p;
	z->next = NULL;
	while (p->next!= NULL) {
		q = p->next;
		p->next = z->next;
		z->next = p;
		p = q;
	}
	r->next = p;
	
}

图解

while前操作

 while循环结束 (中间节点逆置完成)

 最后将r指向p节点即可

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言单链表逆置的代码可以如下编写: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; // 数据域 struct Node* next; // 指向下一个节点的指针 } Node; // 创建节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } // 链表逆置函数 Node* reverseList(Node* head) { Node* prev = NULL; // 当前节点的前一个节点 Node* current = head; // 当前节点 Node* next = NULL; // 当前节点的后一个节点 while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } return prev; } // 打印链表 void printList(Node* head) { Node* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } int main() { Node* head = createNode(1); head->next = createNode(2); head->next->next = createNode(3); head->next->next->next = createNode(4); head->next->next->next->next = createNode(5); printf("原链表:"); printList(head); head = reverseList(head); printf("逆置后的链表:"); printList(head); return 0; } ``` 这段代码定义了一个链表节点结构体Node,其中包括一个数据域和一个指向下一个节点的指针域。接着定义了创建节点函数createNode用于创建新的链表节点。 然后,代码中实现了链表逆置函数reverseList,该函数使用三个指针prev、current和next来实现链表逆置。在逆置过程中,首先将current的next指针指向prev,然后依次更新prev、current和next指针的值。最后返回prev指针作为逆置后的链表的头指针。 在主函数中,首先创建一个包含5个节点的链表。然后打印原链表,调用reverseList函数对链表进行逆置,并打印逆置后的链表。最后返回0,表示程序正常运行结束。 以上就是使用C语言实现单链表逆置的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值