题目:反转链表
描述:定义一个函数,输入链表的头结点,反转该链表并输出反转后链表的头结点。
方法一:迭代法,记录当前节点的下一个节点,当前节点指向上一个节点,然后记录下当前节点,再让下一个节点变成当前节点。
方法二:递归法,先找到最后一个节点,然后从最后一个开始反转,然后返回最后一个节点。
构建Node
class Node {
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
方法一迭代
public Node reverseNode(Node head) {
if(head == null || head.next ==null) {
return head;
}
Node temp = head.next;
Node newHead = reserve(head.next);
// 处理头结点
temp.next = head;
head.next = null;
return newHead;
}
private Node reserve(Node node) {
Node pre = null;
Node next = null;
while (node != null) {
// 记录下当前节点的后续节点
next = node.next;
// 当前节点的下一个节点指向前一节点
node.next = pre;
// 前一节点变成当前节点
pre = node;
// 当前节点的下一个节点变成当前节点
node = next;
}
return pre;
}
递归法:
public Node reverse(Node node,Node prev) {
if (node.next == null) {
node.next = prev;
return node;
} else {
// 拿到最后的节点,也就是反转后的头结点
Node rev = reverse(node.next,node);
node.next = prev;
return rev;
}
}
两种方法供大家参考。