算法描述
给你一个数字单链表的头节点 head ,反转后并输出新链表。
示例1
输入:head = [3,4,5,6,7]
输出:[7,6,5,4,3]
示例2
输入:head = [6,9]
输出:[9,6]
题解
思路一:遍历
/**
* 在遍历时,需将当前节点的next 指针改为指向前一个节点。
* 由于当前节点没有引用其前一个节点,因此必须事先存储其前一个节点。
* 在更改引用之前,还需要存储后一个节点。最后返回新的头引用
*
* @param head
* @return
*/
public Node reverseList(Node head) {
Node prev = null;
Node curr = head;
while (curr != null) {
Node next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
思路二:递归
/**
* 递归反转数字链表
*
* @param head
* @return
*/
public Node reverseListRecursive(Node head) {
if (head == null || head.next == null) {
return head;
}
Node newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
Node代码如下:
class Node {
public Node(int val) {
this.val = val;
}
public Node(int val, Node next) {
this.val = val;
this.next = next;
}
int val;
Node next;
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}