题目描述
输入一个链表,反转链表后,输出新链表的表头。
以下是本篇文章正文内容,下面案例可供参考
解题思路
首先反转链表就是将链表尾部作为新链表的头,以及反转其next域
方法一:定义三个结点
- 先定义一个
newHead
作为新链表的头 - 定义三个结点
prev
、cur
、curNext
,cur
表示当前要反转的结点,prev
表示当前要反转结点的前驱,curNext
表示当前要反转的结点的下一个结点 - 首先,反转链表意味着第一个结点的
next
域为null
,将prev
置为null
,再将cur.next=prev
,表示将cur
的后继换成cur
的前驱,这时,curNext
就排上用场了,cur
的next
域置为空后,就找不到cur.next
了,所以通过curNext
来确定cur.next
的位置,再将prev
指向cur
,cur
指向curNext
,此时,cur
的前驱就是prev
,cur
的后继就是curNext
- 当
curNext
为null
时,cur
就指向newHead
方法二:定义两个结点(头插法)
- 先定义一个
prev
作为cur
的前驱,再定义一个cur
始终指向head
,head
往后走 - 置换
cur
的前驱和后继,再将prev
指向cur
- 当
head
为null
时,将head
指向prev
,返回新链表头
代码如下
方法一:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode newHead = new ListNode(0);
ListNode cur = head;
ListNode prev = null;
if(head == null) return head;
while(cur!=null){
ListNode curNext = cur.next;
if(curNext == null){
newHead = cur;
}
cur.next = prev;//置换cur的前驱和后继
prev = cur;//指向cur
cur = curNext;//cur往后走,即prev为cur的前驱
}
return newHead;
}
}
方法二:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode prev = null;
while(head!=null){
ListNode cur = head;
head = head.next;
cur.next = prev;
prev = cur;
}
head = prev;//此时head指向的是新链表的头
return prev;
}
}
总结
此题主要考链表的相关知识,仔细一点,品一品逻辑
如果本文对你有所帮助,要记得点赞评论哦~
若是有描述不准确的地方,欢迎大家评论区指正,一起学习~