数据结构学习

2017-05-14  本文已影响4人  陈果123

无环单链表的反转

http://blog.csdn.net/feliciafay/article/details/6841115
超经典

方法一:新创建一个单链表

具体代码:
LinkList p = (LinkList)malloc(sizeof(node));
p->next = nill;
while(p1){//原链表的只一个节点
//创建一个新节点
LinkList q = (LinkList)malloc(sizeof(node));
q->data = p1->data;
//头插法直接实现链表的反转
q->next = p->next;
p->next = q;
p1 = p1->next;
}

方法二:循环顺序反转

实现代码
LinkList p = head->next->next;
LinkList  q = head->next;
LinkList  r;
while(p){
        //利用中间指针变量对指针p的下一个节点的位置进行存储
        r = p->next;
        p->next = q;
        q = p;
        p = r;
}
head = q;
image.png

方法三:同样是循环遍历的一种反转方式

实现代码
Linklist p = head->next;
Linklist q;
while(p->next != null){
  q = p->next;
  p->next = q->next;
  q->next = head->next;
  head->next = q;
}
//当p后没有节点时,将原来的头节点链接过来
p->next = head;
head = p->next->next;
p->next->next = null;

方法四: 递归实现

LinkList revers(LinkList head,LinkList & new_head){
  if(head = null){
    return;      
  }
  if(head->next = null){
  new_head = head;  
  return head;
  }
 LinkList new_Tail = LinkList revers(head->next , new_head);
 //完成反向操作
 new_Tail ->next = head;
  //断开连接
 head->next = null;
//返回当前的指针节点
 return head;
}  

总结

上一篇 下一篇

猜你喜欢

热点阅读