问题描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
解题思路:
解法一:
使用栈先进后出的特点进行求解,遍历链表,将所有节点压入栈中,然后将节点以此弹出,形成逆序的新链表。
解法二:
在遍历列表时,将当前节点的 \textit{next}next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
代码实现:
解法一:
public static ListNode reverseList(ListNode head) {
ListNode res = new ListNode(0);
Stack<ListNode> stack = new Stack<ListNode>();
ListNode p = head;
while(p!=null) {
stack.push(p);
p = p.next;
}
p = res;
while(!stack.isEmpty()) {
p.next = stack.pop();
p = p.next;
//由于之前节点的next是有指向的,所以在这里必须清空,否则会出现环,即链表形成一个圆
p.next = null;
}
return res.next;
}
解法一提交结果:
解法二:
public ListNode reverseList(ListNode head) {
ListNode pre = null;
while(head != null){
ListNode temp = head.next;
head.next = pre;
pre = head;
head = temp;
}
return pre;
}
解法二提交结果: