对于单链表的反转我们这里提供三个方法供大家参考
1.头插法
2.利用Stack栈(先进后出)
3.递归实现【和2方法类似,都是通过栈这个数据结构来实现】
一丶头插法
思路:创建一个新的 new_head 指针 用来记录返回反转后的单链表的头指针。遍历原先的链表,每遍历到一个元素Node,将其插入到 new_head 指针的前面【】,再让 new_head 指针指向新插入的节点【Node】,以此类推……实现了单链表的反转
//反转代码
public Node reserve(){
Node reserve_head=new Node("");
//用来保存每遍历一次节点后的下一个节点
Node next=null;
Node temp=head.next;
while (temp!=null){
next = temp.next;
temp.next = reserve_head.next;
reserve_head.next = temp;
temp = next;
}
reture reserve_head.next;
}
二丶利用Stack栈(先进后出)
可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进先出的特点,就实现了逆序打印的效果
代码如下:
public static void reservePrint(HeroNode head){
HeroNode temp = head.next;
Stack<String> stack = new Stack();
while(temp!=null){
stack.push(temp); //压栈
temp=temp.next;
}
while(stack.size()>0{ //出栈
System.out.println(stack.pop()); //Stack栈的特点是先进后出
}
}
二丶递归实现反转
对于整个链表的反转,我们可以分解为多个规模小的节点的反转
代码如下:
private Node Reverses(Node head){
// 递归到最后一个节点,返回新的新的头结点
if (head==null||head.next == null) {
return head;
}
//得到第一个之后返回的新节点的头,因此后面的代码只需要完成
//第 1 个节点的反转即可,因为head.next依然指向第 2 个节点
Node newHead = Reverses(head.next);
head.next.next = head;
head.next = null;
return newHead;
}