题目
翻转链表中第m个节点到第n个节点的部分
注意事项
m,n满足1 ≤ m ≤ n ≤ 链表长度
样例
给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null
解题
只需要翻转其中一部分
根据结点值进行更新链表
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param ListNode head is the head of the linked list
* @oaram m and n
* @return: The head of the reversed ListNode
*/
public ListNode reverseBetween(ListNode head, int m , int n) {
// write your code
if(head==null || head.next == null || m<0 || n<0 || m>=n)
return head;
int len = getLength(head);
ListNode p = head;
if(m>len||n>len)
return head;
int i = m;;
while(m>1){// 找到翻转的前一个结点
m--;
p = p.next;
}
// 记录需要翻转的结点值
ArrayList<Integer> val = new ArrayList<Integer>();
ListNode q = p;
while(i<=n && q!=null){
val.add(q.val);
q = q.next;
i++;
}
// 根据结点值更新原始链表
for( i=val.size()-1;i >=0;i--){
p.val = val.get(i);
p = p.next;
}
return head;
}
public int getLength(ListNode head){
int len = 0;
ListNode p = head;
while(p!=null){
len++;
p = p.next;
}
return len;
}
}
上面违背了出题思想
下面找到翻转位置后进行翻转
参考链接
public class Solution {
/**
* @param ListNode head is the head of the linked list
* @oaram m and n
* @return: The head of the reversed ListNode
*/
public ListNode reverseBetween(ListNode head, int m , int n) {
// write your code
if (m >= n || head == null) {
return head;
}
ListNode dummy = new ListNode(0); // 插入头节点
dummy.next = head;
head = dummy;
for (int i = 1; i < m; i++) { // 找到m节点前面一个节点
if (head == null) {
return null;
}
head = head.next;
}
ListNode premNode = head; // m 前节点
ListNode mNode = head.next; // m 节点
ListNode nNode = mNode;// n节点
ListNode postnNode = mNode.next; // n 后节点
// n 后节点 插入到n 节点之前
for (int i = m; i < n; i++) {
if (postnNode == null) {
return null;
}
ListNode temp = postnNode.next; // 下一个节点
postnNode.next = nNode;
nNode = postnNode;
postnNode = temp;
}
mNode.next = postnNode;// m next 指向 n 后
premNode.next = nNode; // m 前节点 直线 n
return dummy.next;
}
}
时间: 2024-10-13 01:58:12