题目描述:
反转从位置 m 到 n 的链表。用一次遍历在原地完成反转。
例如:
给定 1->2->3->4->5->NULL
, m = 2 和 n = 4,
返回 1->4->3->2->5->NULL
.
注意:
给定 m,n 满足以下条件:
1 ≤ m ≤ n ≤ 列表长度。
我的思路:
先设定一个dummy节点标示整个链表,用pre来表示,m之前的节点。然后对整个m-n范围进行翻转,用一个tmp值来保存之前的节点,cur表示当前节点,next表示之后的节点。cur.next=tmp,然后一次把cur和next向后移动。
我的代码:
class Solution:
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
if m == n:
return head
dummy = ListNode(0)
dummy.next = head
pre = dummy
for i in range(m - 1):
pre = pre.next
tmp = None
cur = pre.next
for i in range(n - m + 1):
next = cur.next
cur.next = tmp
tmp = cur
cur = next
pre.next.next = cur
pre.next = tmp
return dummy.next
Discuss:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* new_head = new ListNode(0);
new_head -> next = head;
ListNode* pre = new_head;
for (int i = 0; i < m - 1; i++)
pre = pre -> next;
ListNode* cur = pre -> next;
for (int i = 0; i < n - m; i++) {
ListNode* move = cur -> next;
cur -> next = move -> next;
move -> next = pre -> next;
pre -> next = move;
}
return new_head -> next;
}
};
学到:
对于单链表的操作可能有多种方法,就像上面两种方法,Discuss中的方法明显更优秀一些,少了一次循环。还不需要一个后续操作。