先定义一下链表:
- typedef struct node
- {
- ElemType data;
- struct node * next;
- }ListNode;
- typedef struct
- {
- ListNode *head;
- int size;
- ListNode *tail;
- }List;
- /*********************************************************
- 非递归的翻转实际上就是使用循环,依次后移指针,
- 并将遇到的链表指针反转
- *********************************************************/
- void ReserveList(List * plist) //非递归实现,
- {
- ListNode * phead; //新链表的头 开始的第一个节点
- ListNode * pt; //旧链表的头 开始的第二个节点
- ListNode * pn; //旧链表头的下一个
- phead = plist->head;
- if(phead && phead->next&& phead->next->next) //首先确定
- {
- phead = plist->head->next; //新链表就是以第一个节点开始,依次在表头添加节点,添加的节点是旧链表的第一个节点
- pt = phead->next; //旧链表,旧链表被取走头结点之后放入新链表的表头,
- pn = pt->next;
- phead->next = 0;
- while(pt)
- {
- pn = pt->next; //pn是旧链表的第二个节点
- pt ->next = phead; //取旧链表的第一个节点插入新链表
- phead = pt;
- pt = pn; //旧链表往后移动
- }
- }
- plist->head->next = phead; //新链表重新赋值到整个链表
- }
- /*********************************************************
- 递归思想,原理也是从就链表上依次取元素放入到新链表
- 直到原始链表被取完,得到新链表
- *********************************************************/
- ListNode * ReserveListRe(ListNode * oldlist,ListNode * newlist)
- {
- ListNode * pt;
- pt = oldlist->next; //取旧链表的表头,pt是现在的旧链表
- oldlist->next = newlist; //就旧链表插入到新链表
- newlist = oldlist; //如果旧链表是空,表示旧链表被取完了,新链表就是翻转之后的链表
- return (pt == NULL) ? newlist : ReserveListRe(pt,newlist);
- }