1:反转链表
递归实现
注意反转后,第一个节点和第二个节点之间的循环引用(反转后的倒数第二个节点指向倒数第一个,但倒数第一个还是指向的倒数第二个,从而造成循环引用,所以反转后,要把头节点置空)
public class Main {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
ListNode head;
public static void main(String[] args){
ListNode head = new ListNode(-1);
ListNode cur = head;
for (int i=0; i<5; i++){
cur.next = new ListNode(i);
cur = cur.next;
}
cur = head;
while (cur != null){
System.out.println(cur.val);
cur = cur.next;
}
Main m = new Main();
ListNode head2 = m.reverseList(head);
cur = head2;
while (cur != null){
System.out.println(cur.val);
cur = cur.next;
}
}
public ListNode reverseList(ListNode head) {
if (head != null){
this.reversCore(head);
head.next = null;
return this.head;
}else {
return head;
}
}
public ListNode reversCore(ListNode node){
if (node.next == null){
this.head = node;
return node;
}
reversCore(node.next).next = node;
return node;
}
}
循环实现
只要用3个指针,一个保存前一个节点,一个保存当前节点,一个保存后一个节点,这样就可以一段一段的反转了:
public ListNode reverseList(ListNode head) {
if (head == null){
return null;
}
ListNode p = null;
ListNode cur = head;
while (cur != null){
ListNode next = cur.next;
cur.next = p;
p = cur;
cur = next;
}
return p;
}