单链表反转问题
1.问题描述
对一个单向链表进行反转操作,如1-->2-->3-->4-->5-->null
翻转后的结果为5-->4-->3-->2-->1-->null
2.解决方案
A 遍历链表
把链表拆分成数组 然后把数组逆序组装成链表
该方法实现简单,不需要太多指针,缺点是需要n个单位的空间
B 指针逆序
三个指针,分别指向 当前节点(p),当前节点的下一个节点(q),q的下一个节点(r)。r的存在是为了修改q的next指针指向p时,原本q的next值不会丢失。源码如下。
public class Node {
public int value;
public Node next;
public Node(int value) {
this.value = value;
}
public boolean hasNext() {
return next != null;
}
}
private static Node reverse(Node node) {
Node p = node;
Node q = p.next;
Node r;
p.next = null;
while (q != null) {
r = q.next;
q.next = p;
p = q;
q = r;
}
return p;
}
C 递归法
首先,把第一个节点之后的部分D视为一个整体,认为D已经是逆序的,现在要做的是把第一个节点和D节点组成的链表进行逆序;
扫描二维码关注公众号,回复:
12354600 查看本文章
其次,要对D节点内部进行逆序,用同样的思维进行处理;
再次,递归出口,当D节点的next为空时,说明D节点是最后一个节点,直接返回即可。
实现源码如下。
/**
*
* @param node 链表头结点
* @param pre 头结点逆序指向的节点
* @return
*/
private static Node reverseRecursion(Node node, Node pre) {
Node head = node;
Node pnext = head.next;
head.next = pre;
if (pnext == null) {
return head;
}
return reverseRecursion(pnext, head);
}
以上