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