1、链表节点类
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
2、问题描述
给你单链表的头节点 head ,反转链表,并返回反转后的链表。
3、实现
3.1、头插法重新建一个链表,遍历原先的链表,根据原先链表节点的值,新建链表节点元素,放入新链表。
public ListNode reverseList(ListNode head) {
ListNode p;
//头节点
ListNode header = new ListNode();
//使用头插法创建一个新的链表
while (head != null) {
p = new ListNode(head.val);
p.next = header.next;
header.next = p;
head = head.next;
}
return header.next;
}
3.2、原地反转,如下图
public ListNode reverseList2(ListNode head){
//前置节点
ListNode pre = null;
//指向当前节点,初始化为头节点
ListNode cur = head;
//记录当前节点的下一个节点
ListNode temp = null;
while (cur!=null){
//记录当前节点的下一个节点
temp = cur.next;
//调转方向
cur.next = pre;
//前置节点后移
pre = cur;
//当前节点后移
cur = temp;
}
return pre;
}