面试题—数据结构之单链表详述(基本篇2)

            下面也是关于单链表的操作问题,实现单链表的逆置,关于这个问题,最容易想到的方法是遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向下一个元素,然后将当前节点元素的指针反转,利用已经存在存储的指针完后继续遍历。

下面是实现代码:

//单链表的逆转
node *MyReverse(node *head)
{
	node *p = NULL;
	node *q = NULL;
	node *r = NULL;
	if(NULL == head->next)  //链表为空
	{
		return head;
	}
	p = head->next;
	q = p->next;			//保存原第二个节点
	p->next = NULL;			//原第一个节点为末节点
	
	while(NULL != q)  //遍历,各个节点的next指针反转
	{
		r = q->next;		//记录剩下的链表
		q->next = p;		//反转
		p = q;				//指针后移动一位
		q = r;
	}
	head->next = p;			//新的第一个节点为原末节点
	return head;
}

寻找单链表的中间元素:

          这里采用一遍扫描的方法,假设mid指向当前已经扫描的子链表的中间元素,cur指向当前已经扫描链表的未节点,继续扫描即移动cur到cur->next,这时只需判断一下是否移动mid到mid->next就可以了,也就是cur移动两步时,mid只移动一步;所以一遍扫描就能找到中间位置。代码如下:

//查找单链表的中间元素
node *search_mid(node *head)
{
	int i=0; 
	int j=0;
	node *current = NULL;
	node *middle = NULL;
	
	current = middle = head->next;
	while(NULL != current)
	{
		if(i / 2 > j)			//j移动步数是i移动的一半
		{						//i移动2步,j才移动1步
			j++;
			middle = middle->next;
		}
		i++;
		current = current->next;
	}

	return middle;
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值