本文共 1450 字,大约阅读时间需要 4 分钟。
Reverse a linked list from position m to n. Do it in-place and in one-pass.
Example :
Given 1->2->3->4->5->NULL, m = 2 and n = 4,return 1->4->3->2->5->NULL.
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.这道题考的知识点是链表,由于题目要求是只能遍历一次,并且是在原链表上操作,所以很容易想到就是把要翻转的元素逐个插入到不需要翻转的元素的后面。举个例子,比如1->2->3->4->5->NULL, m = 2 and n = 4,那么就是把3,4插入到1的后面,即
插入3:1->3->2->4->5->NULL 插入4:1->4->3->2->5->NULL 由于可能整个链表需要翻转,为了方便操作,我特意先在链表头前插入一个辅助元素,整个插入过程见下图:只要理清链表插入的操作并且最后注意返回的应该是去除辅助元素的链表就能通过。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode *pHead = new ListNode(0); ListNode *pTail = nullptr; ListNode *pNext = nullptr; ListNode *pPrev = pHead; pHead->next = head; for(int i = 0; i < m - 1; i++) { pHead = pHead->next; } pTail = pHead->next; for (int i = m; i < n; i++) { pNext = pTail->next; pTail->next = pNext->next; pNext->next = pHead->next; pHead->next = pNext; } return pPrev->next; }};
这道题是一道普通的链表题,虽然难度是中等,但是感觉实际难度应该是简单,只要处理好链表的插入操作就行。
最近都在忙着找实习,顾着复习基础知识和刷笔试真题,所以少在LeetCode上刷题了,但是每周至少一道还是能保证的,抓紧时间,努力加油,希望能快点找到心仪的实习 ↖ ( ^ ω ^ ) ↗