题目
输入一个链表,反转链表后,输出新链表的表头。
牛客网给定以下链表类。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
分析
思路:
要实现翻转链表,如下图,设i为当前结点cur,则首先需将cur.next保存到一临时结点,否则如果改变了cur的指向,链表就断了。然后将cur指向前一结点,因此前一结点也需一临时结点存储。最后需要三个临时结点,我们设为pre,cur,next。详细思路见代码。
注意:此处要注意以下三个边界条件:
1)输入的头结点为null;
2)输入的链表只有1个结点;
3)输入的链表有多个结点;
代码:
public class Solution {
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
ListNode next = null;
while(cur != null) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next; //注意此处因cur指向下一个结点了已经,然后继续进入while判断,最后一个结点为null时,其前一个结点才是倒数第一个结点。因此最后应返回pre结点。
}
return pre;
}
}
}