1.1、[206]. Reverse Linked List
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
非递归:
{
if(null == head || null == head.next){
return head;
}
ListNode p1 = head;
ListNode p2 = p1.next;
ListNode p3 = p2.next;
p1.next = null;
while(null != p3){
p2.next = p1;
p1 = p2;
p2 = p3;
p3 = p3.next;
}
p2.next = p1;
return p2;
}
递归:
public static ListNode reverseList1(ListNode head) {
if(null == head || null == head.next){
return head;
}
ListNode newHead = reverseList1(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
1.2、[92]. Reverse Linked List II
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
public static ListNode reverseBetween(ListNode head, int m, int n) {
ListNode curNode = head;
//m前面一个节点
ListNode preNode = head;
for (int i = 1; i <= m - 1; i++) {
preNode = curNode;
curNode = curNode.next;
}
ListNode beforePre = preNode;
ListNode beforeCur = curNode;
preNode.next = null;
for (int j = m; j <= n; j++) {
if(null != curNode){
ListNode t = curNode.next;
curNode.next = preNode;
preNode = curNode;
curNode = t;
}
}
if(1 == m){
beforeCur.next = curNode;
return preNode;
}
beforePre.next = preNode;
beforeCur.next = curNode;
return head;
}