LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
①就地反转
就地反转即:不增加新的链表在该链表上进行反转
原链表:dummy->1->2->3->4->5
循环一次:dummy->2->1->3->4->5
循环二次:dummy->3->2->1->4->5
循环三次:dummy->4->3->2->1->5
循环四次:dummy->5->4->3->2->1
代码如下:
// 1.就地反转法
public ListNode reverseList1(ListNode head) {
if (head == null)
return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode p = dummy.next;
ListNode q = p.next;
while (q != null) {
p.next = q.next;
q.next = dummy.next;
dummy.next = q;
q = p.next;
}
return dummy.next;
}
②头插法
新建单链表
初始状态如下:
// 2.新建链表,头节点插入法
public ListNode reverseList2(ListNode head) {
ListNode dummy = new ListNode(-1);
ListNode pCur = head;
while (pCur != null) {
ListNode pNex = pCur.next;
pCur.next = dummy.next;
dummy.next = pCur;
pCur = pNex;
}
return dummy.next;
}
③迭代法
public ListNode reverseList(ListNode head) {
ListNode prev = null;
while(head!=null){
ListNode tmp = head.next;
head.next = prev;
prev = head;
head = tmp;
}
return prev;
}
④递归法
public ListNode reverseList(ListNode head) {
if(head==null||head.next ==null)
return head;
ListNode prev = reverseList(head.next);
head.next.next = head;
head.next = null;
return prev;
}
第一次写博客,有很多不足,希望大家批评指正!