19:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode ret = new ListNode(0, head);
ListNode pre = ret;
ListNode rear = pre;
while (n-- >= 0) { // n-- > 0
rear = rear.next;
}
// 这里只需要判断rear是否为空,不需要利用rear指向的节点。
// 所以循环退出的判断条件,既可以是rear != null 或者 rear.next != null
// 如果需要用到rear只想的节点的话,就要改成rear.next != null,并将上面循环退出条件改为 n-- > 0
while(rear != null) {
pre = pre.next;
rear = rear .next;
}
pre.next = pre.next.next;
return ret.next;
}
61:
public static int lengthOf(ListNode head) {
int len = 0;
while (head != null) {
len++;
head = head.next;
}
return len;
}
public ListNode rotateRight(ListNode head, int k) {
if (head == null || head.next == null || k == 0)
return head;
int len = lengthOf(head);
if ((k = (k % len)) == 0)
return head;
ListNode ret = new ListNode(0, head);
ListNode pre = ret;
ListNode rear = ret;
while (k-- > 0) {
rear = rear.next;
}
// 由于这里需要用到rear指针的节点的next字段,所以不能用rear != null来作为循环退出条件
while (rear.next != null) {
pre = pre.next;
rear = rear.next;
}
ListNode tmp = ret.next;
ret.next = pre.next;
pre.next = null;
rear.next = tmp;
return ret.next;
}
19题中,双指针的后一个指针,只是用来判断结束位置,而61题中,需要同时用到两个指针。
通过rear.next != null来作为循环退出条件,可以保存rear所指向节点的信息。