单链表反转

把每次翻转看成左右两个部分的翻转,比如第一次翻转时把左边的第一个节点看成左部分,把右边的第二个节点看成右部分,来进行翻转,第二次翻转时把左边的两个节点看成一个左部分,右边的第三个节点看成右部分,那么第二次翻转就是左边的由第一个和第二个节点组成的左部分和右边的由第三个节点组成的右部分进行翻转,第三次翻转以此类推。。

这样的话我们让current指针始终指向每次反转的两部分中的左部分的最后一个节点,注意,左部分的节点为一个或者很多个,令temp=current->next这个指针指向右部分的节点,注意,右部分节点始终只有一个。So....看下面代码:

#include<iostream>
using namespace std;
struct ListNode{
	int data;
	ListNode *next;
};
ListNode* Create_Linklist(int *arr,int len)
{
	ListNode* head = new ListNode();
	head->next = NULL;
	ListNode* L = head;
	for (int i = 0; i < len; i++)
	{
		ListNode* newn = new ListNode();
		newn->data = arr[i];
		newn->next = NULL;
	    L->next = newn;
		L = L->next;
	}
	return head;
}
void Reverse_LinkList(ListNode* &head)
{
	if ( head && head->next )
	{
		ListNode* current = head->next;   //current始终指向每次被反转后的节点中的最后一个,因此current的next节点就是要被反转的节点,即tamp
		ListNode*  temp;   //temp始终指向被反转的节点,因此 temp 等于 current->next
		while (current->next)
		{
			temp = current->next;
			current->next = temp->next;
			temp->next = head->next;
			head->next = temp;
		}
	}
}
void Print_LinkList(ListNode* &head)
{
	if (head)
	{
		ListNode* L = head;
		L = L->next;
		while (L)
		{
			cout << L->data;
			L = L->next;
		}
	}
}
void main(int argc, char *argv[])
{
	int arr1[] = { 1, 3, 5, 7 };
	ListNode* head = Create_Linklist(arr1, sizeof(arr1) / sizeof(int));
	Reverse_LinkList(head);
	Print_LinkList(head);  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值