定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
思路一:指针
public ListNode reverseList(ListNode head) {
//初始设定
ListNode pre = null;
ListNode cur = head;
//终止条件
while(cur != null){
//头插法,先用temp暂存cur的下一个结点
ListNode temp = cur.next;
//将cur指向前一个结点pre
cur.next =pre;
//归位,pre先还原到cur,然后cur还原到temp
pre = cur;
cur = temp;
}
return pre;
}
思路二:栈
public ListNode reverseList(ListNode head) {
Stack<ListNode> stack = new Stack<>();
//将链表结点全部入栈
while (head != null) {
//存入第一个结点
stack.push(head);
//存入其他结点
head = head.next;
}
if (stack.isEmpty())
return null;
ListNode node = stack.pop(); //反转第一个元素
ListNode dummy = node; //临时结点
//栈中的结点全部出栈,然后重新连成一个新的链表
while (!stack.isEmpty()) {
ListNode tempNode = stack.pop();
node.next = tempNode;
node = node.next;
}
//最后一个结点就是反转前的头结点,一定要让他的next等于空,否则会构成环
node.next = null;
return dummy;
}