链表问题
LeetCode206
带DummyHead的方式头插法:
带虚拟头结点的方式实现只需要创建一个额外节点用于存放头插法时的节点即可
public static ListNode reverseListByDummyNotCreate(ListNode head) {= ListNode ans = new ListNode(-1);
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = ans.next;
ans.next = cur;
cur = next;
}
return ans.next;
}
不带头结点:
不带头结点相当于进行链表相反操作,需要创建两个节点prev、cur。
prev节点相当于记录当前节点的新下一个节点,就是当前节点的前一个节点,cur节点用于记录当前节点和next节点防止断链。
public static ListNode reverseListSimple(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
递归实现:
public static ListNode reverseListByRecurse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseListByRecurse(head.next);
head.next.next = head;
head.next = null;
return newHead;
}