算法描述:
仔细观察这个排列,发现它 先从前半段 从前往后 取一个元素,再从后半段 从后往前 依次取一个元素,那么,如果要实现这个流程,每次需要遍历到最后取,因为在后半段从后往前取元素十分麻烦。
因此,我们其实很难想到自然就想到,将后半段元素逆置,这样的话,就可以定义两个指针p、q,分别指向前、后段的打头的结点,将q所指的结点连接到p后面,接着进行下一个结点的连接......
ok,费了好大劲写明白了算法,接下来就实现吧。我们老师总是说,只要不写代码,算法还是很简单的是吧?呵呵......用你说。
算法实现:
1、定义两个指针p、q,p,q指向第一个节点,
2、判断链表的长度的奇偶,如果是奇数,p前移len/2个结点,q前移len/2+1个结点
如果是偶数,p前移len/2-1个结点,q前移len/2个结点
3、定义一个辅助结点指针a,将p的next设为NULL
4、a将q所指的后半段链表一个个前插入以p为头结点的链表中,这样做是为了将后半段逆置
5、接着开始连接操作,将q指向p,将p指向第一个节点,
6、把q->next指向的结点移动到p的后面,辅助结点指针a指向q->next,将q->next指向a->next
7、a->next=p->next,p->next=a,p=a->next
8、继续从7开始的操作,直至p!=q(这个条件对于奇偶都成立,需要好好在纸上画画)
链表的操作只要借助一个简单的图示就能很好理解。
好了,差不多了,画完我就要累死了。
我的大功告成了,如果有小伙伴代码写不出来,可以私我看一下代码,我本来想把代码贴出来的,但是吧,我又想,这又不是什么很高级的代码,只是一个题目而已,看完了分析自己就大致写的出来。