链表的基础定义还是比较简单的,只需定义对应链表节点的节点值,链表节点的next指针即可构建出链表数据结构,在本文中,会带大家了解一下力扣经典链表题目:翻转链表。
首先给出我们链表的数据结构定义:
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
要进行链表的翻转,其实就是头指针从第一个节点开始遍历至最后一个节点,将其顺序改成从最后一个节点遍历回第一个节点,如下图:
不难看出,我们如果能够改变next指针的指向,即可完成链表的一个翻转操作。这时,我们可以考虑使用双指针的操作,一个指针在前,一个指针在后,引入中间变量指针tmp,可以轻松地实现链表的翻转,具体代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr) { //判断链表是否为空链表
return nullptr;
}
ListNode* front = head; //作为前方的指针
ListNode* hind = nullptr; //位于后方的指针(!!!注意,这个时候需要将其置为空指针,不能指向head,不然头节点将会被遗漏)
ListNode* tmp = head; //中间变量节点,用于接收前方指针移位前的位置,将其指向后方的hind指针就可以实现翻转了
while (front != nullptr) {
tmp = front; //步骤不能乱,front必须在hind前面操作,不然会造成指针丢失
front = front->next;
tmp->next = hind;
hind = tmp;
}
head = hind;
return head;
}
};
本篇文章分享到此,欢迎各位留言交流!
1260

被折叠的 条评论
为什么被折叠?



