题目描述
输入一个链表,反转链表后,输出新链表的表头。
 示例1
 输入
 复制
 {1,2,3}
 返回值
 复制
 {3,2,1}
题解:
如果用偷懒的方法,可以用vector来存链表内容,然后来个翻转(vector自带)即可
 但是,我们不可能光靠这种方法,来讲一下正解
 
 通过图我们可以看出,其实翻转链表,也就是将指向翻转
 所以我们需要一个链表s作为存新数据(也就是翻转后的数据)
 还需要一个q作为中间变量
 链表p为题目所给的pHead
 步骤:
 先用q存p的下一个节点的地址,这样是因为后续p有其他操作,如果不提前保存会丢失
 然后将p->next=s,将当前节点与链表中断,并指向s
 然后将s=p,
 这两步操作可以理解为,将当前节点从原链表中取出,并将下一个节点指向当前节点(相当于调转了箭头方向)
 从原本的
 p —> p->next
 变成了
 p->next ---->p
 然后这个是存在s内的
 最后将p=q,相当于原本暂存的东西还给p,使得p的后续没有发生改变
代码:
/*
struct ListNode {
   
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
   
	}
};*/
class Solution {
   
public:
    ListNode* ReverseList(ListNode* pHead) {
   
        if(pHead==NULL)return NULL;
            ListNode * p=pHead;
        ListNode * s=NULL;
        ListNode * q=NULL;
        while(p!=NULL)
        {
   
            q=p->next;//先用q来记录下一个节点的地址
            p->next=s;//让当前节点与链表中断,并指向前一个节点s
            s=p;//s指向当前节点
            p=q;//p指向q,而q存的是下一个节点的地址
            
        }
        return s;
    }
};

 京公网安备 11010502036488号
京公网安备 11010502036488号