题目
思路
自己在草稿本上面画了一下,即对每个节点的next指向该节点的前一个节点,依次遍历所有node。但是有两种情况要分开讨论:1)当前链表为空或者只有一个node时,返回原头节点;2) 当前链表长度为2时,只需要将第二个node的next指向第一个node;
后面看见别人的代码才发现不用这么麻烦,对p指针返回就不用分情况讨论了。
代码
//原代码
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null){//链表为空或者长度为1时,翻转后也是原链表,则直接返回原head
return head;
}
ListNode temp = new ListNode();
ListNode p = new ListNode();
ListNode q = new ListNode();
p = head.next;
q = head; //指向p节点的前继节点
if(head.next.next == null){//长度为2的链表 只需改变一个指针
p.next = q;
q.next = null;
return p;
}
// 其他情况需要再加入一个指针temp来记录当前结点的next节点 修改完当前节点的next后 遍历修改后续节点
// 第二个和第一个节点之间,需要将原来第一个节点的next修改为null,其他位置不需要修改q的next
temp = p.next;
p.next = q;
q.next = null;
q = p;
p = temp;
//进入循环 依次遍历后续节点
while (p.next != null){
temp = p.next;
p.next = q;
q = p;
p = temp;
}
// 结尾特别处理
p.next = q;
return p;
}
}
//修改后的代码
class Solution {
public ListNode reverseList(ListNode head) {
ListNode temp = new ListNode();
ListNode p = new ListNode();
ListNode q = new ListNode(); //指向p节点的前继节点
q = null;
p = head;
while (p != null){
temp = p.next;
p.next = q;
q = p;
p = temp;
}
return q;
}
}