everse a linked list.
Example
For linked list 1->2->3, the reversed linked list is 3->2->1
Challenge
Reverse it in-place and in one-pass
翻转一个list,如果把node的指针指向前一个, 则node.next就没法得到 所以需要使用双指针,
public class Solution { /** * @param head: The head of linked list. * @return: The new head of reversed linked list. */ public ListNode reverse(ListNode head) { ListNode prev = null; while(head != null){ ListNode tem = head.next; head.next = prev; prev = head; head = tem; } return prev; } }
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given
Given
1->2->3->4->5->NULL
, m = 2 and n = 4,
return
1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
翻转m--n, 不仅要把m-n转好, preMnode. next 要指向n, m.next 要指向postNnode
public class Solution { public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if (m > n || head == null){ return head; } ListNode dummy = new ListNode(0); dummy.next = head; head = dummy; for (int i = 1; i < m; i++){ head = head.next; } ListNode preM = head; ListNode mNode = head.next; ListNode nNode = mNode; ListNode postN = mNode.next; for (int i = m; i < n; i++){ ListNode tem = postN.next; postN.next = nNode; nNode = postN; postN = tem; } preM.next = nNode; mNode.next = postN; return dummy.next; } }
更好地解决方法:
维护3个指针,startpoint,node1和node2。
startpoint永远指向需要开始reverse的点的前一个位置。
node1指向正序中第一个需要rever的node,node2指向正序中第二个需要reverse的node。
交换后,node1 在后,node2在前。这样整个链表就逆序好了。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if (m > n || head == null){ return head; } ListNode dummy = new ListNode(0); dummy.next = head; ListNode startpoint = dummy; ListNode node1 = null; ListNode node2 = null; for (int i = 0; i < n; i++){ if (i < m-1){ startpoint = startpoint.next;// startpoint 指向m-1点 } else if (i == m-1){ node1 = startpoint.next; node2 = startpoint.next.next; }else{ node1.next = node2.next;//node1 指向node2的后面 node2.next= startpoint.next;//node2 放入startpoint后面 startpoint.next = node2;//同上一行 node2 = node1.next;// 改变node2变成node1的下一个, 再开始下次以转换 } } return dummy.next; } }
没有评论:
发表评论