我之前把它刷过两遍,遇到后又有点懵……
随即我打算记录一下我的思路。
首先有三个指针完成:
dummyHead—始终指向链表头部(一开始创建作为虚拟头节点,以防空指针)
pre—主要记录下一次要旋转的结点的前一个结点的位置
cur—主要记录这次要插到dummyHead位置的结点
他们的位置在每次迭代前后都必须是dummyHead—pre—cur
核心代码:
pre.next = cur.next;
cur.next = dummyHead;
dummyHead.next = cur;
cur = pre.next;
可以看到1和4的三个指针的状态、位置一模一样;
截至条件是什么呢?cur==null;
完整代码:
public ListNode reverseList(ListNode head) {
if(head == null || head.next ==null) return head;
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode pre = head;
ListNode cur = head.next;
while(cur != null){
pre.next = cur.next;
cur.next = dummyHead.next;
dummyHead.next = cur;
cur = pre.next;
}
return dummyHead.next;
}