今天是38妇女节,祝愿自己的母亲以及世界上所有的中老年女性节日快乐!刚刚尝试了一下链表的问题,难度不大,现在来分享一下经验吧!
题目如下:
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
题意分析:
给定一个单链表,请将其进行翻转。
解答如下:
方法一(变指针指向不变值)
先用三个指针(pre指向NULL,cur指向head,next指向cur指向节点指向的下一个节点)。每次反转一个节点的指针指向具体操作如下:当cur指针不为空时,先将nex指针指向cur指向节点指向的下一个节点,再将cur指向节点指向下一个节点的指针指向pre,再将pre指向cur,然后将cur指向nex。直到while循环结束,链表反转完毕并返回链表的头指针。
class Solution{
public:
ListNode* reverseList( ListNode* head ){
ListNode* pre = NULL;
ListNode* cur = head;
while ( cur != NULL){
ListNode* nex = cur -> next;
cur -> next = pre;
pre = cur;
cur = nex;
}
return pre;
}
};
提交后的结果如下:
方法二(不变指针指向变值)
先遍历一遍链表,将链表中每个节点的val用nums.push_back()操作进行保存,再遍历一遍nums数组,将数组中的值依次反向赋值给链表中每个节点,链表反转完毕并返回链表的头指针。
注:①链表遍历一般用while
②数组遍历一般用for
class Solution{
public:
ListNode* reverseList( ListNode* head ){
ListNode* curNode = head;
vector<int> nums;
while( curNode != NULL){
nums.push_back(curNode -> val);
curNode = curNode -> next;
}
curNode = head;
for ( int i = 0; i < nums.size(); i++ ) {
curNode -> val = nums[nums.size() - i -1];
curNode = curNode -> next;
}
return head;
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。