剑指Offer——反转链表
解题思路一:我们可以用栈的方式,把链表中的元素都压栈,改变next域,然后一次弹出,时间复杂度稍高。
/**
* 使用栈的方式
* @param head 头结点
* @return 头结点
*/
public ListNode ReverseList(ListNode head) {
Stack<ListNode> nodeStack = new Stack<>();
ListNode h = null;
while (head!=null){
nodeStack.push(head);
head = head.next;
}
if (!nodeStack.isEmpty()){
h = nodeStack.peek();
}
while (!nodeStack.isEmpty()){
head = nodeStack.pop();
if (!nodeStack.isEmpty()){
head.next = nodeStack.peek();
}else {
head.next = null;
}
}
return h;
}
解题思路二:使用迭代的方式,定义一个指针,相当于用指针的next指向排序前当前节点的前一个节点或者排序后当前节点的后一个节点,时间复杂度少低。
/**
* 使用迭代的方式
* 定义一个指针,相当于用指针的next指向排序前当前节点的前一个节点或者排序后当前节点的后一个节点。
* @param head 头结点
* @return 头结点
*/
public ListNode ReverseList2(ListNode head) {
ListNode p1 = new ListNode(-1);
while (head!=null){
ListNode next = head.next;
head.next = p1.next;
p1.next = head;
head = next;
}
return p1.next;
}