单链表的反转可以使用循环,也可以使用递归的方式
1.循环反转单链表
循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可。
![](https://img-blog.csdn.net/20140704123508390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYwODM1Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
代码:
- class ListNode:
- def __init__(self,x):
- self.val=x;
- self.next=None;
-
- def nonrecurse(head):
- if head is None or head.next is None:
- return head;
- pre=None;
- cur=head;
- h=head;
- while cur:
- h=cur;
- tmp=cur.next;
- cur.next=pre;
- pre=cur;
- cur=tmp;
- return h;
-
- head=ListNode(1);
- p1=ListNode(2);
- p2=ListNode(3);
- p3=ListNode(4);
- head.next=p1;
- p1.next=p2;
- p2.next=p3;
- p=nonrecurse(head);
- while p:
- print p.val;
- p=p.next;
2.递归实现单链表反转
- class ListNode:
- def __init__(self,x):
- self.val=x;
- self.next=None;
-
-
- def recurse(head,newhead):
- if head is None:
- return ;
- if head.next is None:
- newhead=head;
- else :
- newhead=recurse(head.next,newhead);
- head.next.next=head;
- head.next=None;
- return newhead;
-
- head=ListNode(1);
- p1=ListNode(2);
- p2=ListNode(3);
- p3=ListNode(4);
- head.next=p1;
- p1.next=p2;
- p2.next=p3;
- newhead=None;
- p=recurse(head,newhead);
- while p:
- print p.val;
- p=p.next;