**反转链表:**不修改每个结点,修改每个结点的指向。
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。反转链表
1.思想
- 判断链表是否为空,为空就返回
null
- 不为空定义结点
cur
指向链表头结点,定义前驱结点prev
为空,只要当cur!=null
时候就进入循环,每次将ListNode curNext = cur.next;
然后将cur
指向其前驱结点prev
;然后前驱结点后移使prev=cur;
最后cur=curNext
;
2.具体步骤
3.代码
public ListNode reverseList() {
if (this.head == null) {
return null;
}
ListNode cur = this.head;
ListNode prev = null;
while (cur != null) {
ListNode curNext = cur.next;
cur.next = prev;
prev = cur;
cur = curNext;
}
return prev;
}
测试:
public static void main(String[] args) {
MyLinkedList myLinkedList = new MyLinkedList();
//myLinkedList.createList();
myLinkedList.addLast(12);
myLinkedList.addLast(23);
myLinkedList.addLast(34);
myLinkedList.addLast(45);
myLinkedList.addLast(56);
System.out.println("反转前:");
myLinkedList.display();
ListNode ret=myLinkedList.reverseList();
System.out.println("反转后:");
myLinkedList.display2(ret);
}
注意:
链表反转之后不能从原来的链表头结点打印,因为原来头结点head指向空了,后面的结点就不能打印,智能打印一个节结点。
因此反转之后,按照上面分析prev
就是头结点,所以我们返回头结点,用一个参数去接收,打印的时候从新的头结点开始打印。
打印: