方法1:迭代
思想:
将当前节点curr的指针指向前一个节点prev
前一个节点prev指向当前节点curr,即prev = curr
最后 curr =curr.next 指向下一个节点
代码
// 初始化3个指针
// 1, prev = null,最后指向反转链表的最后一个节点
// 2.curr=head,待反转链表的第一个节点
// 3.next = curr.next 待反转链表的第二个节点;当curr改变指向后,后面的链表失效,因此需要先保存链表
while(curr!=null){
next = curr.next; // 保存后面链表
curr.next = prev; // 改变链表指向
prev = curr;
curr = next // 后移动当前节点
}
return prev
方法二:递归
递归的终止条件:head =null 或 head.next =null
head.next.next = head
head.next =null
if head == None or head.next ==None:
return head
// curr 是链表的最后一个节点
curr = reverseList(head.next)
head.next.next =head
head.next =None
return curr
方法3:使用栈
栈是先进后出的数据结构,将链表节点依次入栈,全部入栈后再全部出栈,出栈的时候把节点串成一个新的链表
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 newNode = stack.pop()
node.next = newNode
node = node.next
}
node.next = null;
return dummy;