链表节点:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
1.遍历链表,边遍历边反转
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null) //链表为空
return null;
ListNode pre = null; //pre指向当前节点的前一个节点
ListNode next = null; //next指向当前节点的下一个节点
while(head != null){
next = head.next; //先用next指向当前节点的下一个节点,防止反转head节点时下一个节点信息丢失
head.next = pre; //反转head节点
pre = head; //pre指向当前节点
head = next; //head指向下一个节点
}
return pre;
}
}
2.使用递归
递归思路:想要反转链表head,可以先反转链表head.next,然后令head.next.next = head; head.next=null;完成整个链表的反转
递归的出口即当链表仅有一个节点的时候返回该节点
递归思路其实就是利用递归遍历到链表的最后一个节点,从最后一个节点开始从后往前反转链表
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null) //当链表为空或者只有一个元素时,递归出口
return head;
ListNode node = ReverseList(head.next); //递归,反转节点head.next以及之后的链表
head.next.next = head; //将head.next节点指针反转
head.next = null;
return node;
}
}
3.头插法
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null)
return null;
ListNode newHead = null;
ListNode temp = null;
while(head != null){
temp = head;
head = head.next;
temp.next = newHead;
newHead = temp;
}
return newHead;
}
}