题解 | #反转链表# C++实现

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

反转单链表,C++实现

struct ListNode{
	int val;
  	ListNode* next;
  	ListNode(int x):val(x),next(NULL){}
};

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
      	
      	//最好是加上传入指针非空的判断,更规范
        if(pHead==NULL){
            return NULL;
        }
 
        //记住反转单链表没有用到虚拟头节点,而是双指针
        ListNode* p1=NULL;
        ListNode* p2=pHead;
        
        while(p2!=NULL){
            ListNode* temp=p2->next;//注意要用到一个临时节点
            p2->next=p1;//先干主要的,换向,注意不要写反了
            p1=p2;//由于p1和p2之间指针已经被反向,一旦p2前进,会导致p1无法访问到下一个节点,所以需要先动p1,且p1的移动是靠p2来完成的
            p2=temp;//p2和temp之间是断层的,最后p2的移动是依赖temp完成的  
        }
        
        return p1;//注意最后返回的不是head
        
    }
};

注意:

  1. 参数只有一个,链表头指针,传入时要进行非空判断
  2. 左指针初始化时指向的是NULL
  3. 临时指针是在循环内部创建的
  4. 先换向,再将两个指针步进
  5. 最后返回的是左指针,不是head
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务