206. 反转链表(单链表(反转))

  • 题目链接:206. 反转链表
  • 考查知识:单链表(反转)
  • 题意描述:将给定链表进行反转
  • 具体代码
    • 方法一:头插法

      • 在遍历链表的同时不断让当前结点对当前链首结点做前插成为新的链首结点即可
      class Solution {
      public:
          ListNode* reverseList(ListNode* head) {
          	if(head==NULL)return NULL; 
              ListNode *p=head->next,*t;
              head->next=NULL;
              while(p!=NULL){
                  t=p->next;//保存后继
      			p->next=head;//取出结点p对head做头插
      			head=p;//更新头结点 
      			p=t;//更新p结点 
              }
              return head;
          }
      };
      
    • 方法二:反转指针

      • 设立p指向遍历过程中访问的当前结点,pre指向其前驱(初始为NULL)
      • 遍历链表的过程中,不断保存当前结点p的后继,然后令当前结点p的指针反向指向前驱pre,最后两指针依次后移即可
      class Solution {
      public:
          ListNode* reverseList(ListNode* head) {
          	ListNode *pre=NULL,*p=head;
              while (p!=NULL) {
                  ListNode* t=p->next;//保存后继 
                  p->next=pre;//反转指针 
                  pre=p;p=t;//两指针前移 
              }
              return pre;
      	}
      };
      
    • 方法三:递归

      • 递归的对下一结点进行处理,所以递归边界为head->next = = == ==NULL或head = = == ==NULL
      • 让当前结点下一结点的指针域指向当前结点;即head->p->变为head<=>p
      • 当前结点指针域置为NULL,即head<=>p变为<-head<-p
      • 返回反转链首结点
      class Solution {
      public:
          ListNode* reverseList(ListNode* head) {
          	if(head==NULL||head->next==NULL)return head;//递归边界 
          	ListNode *p=reverseList(head->next);//递归的对下一结点进行处理 
      		head->next->next=head;//让当前结点下一结点的指针域指向当前结点;即head->p->变为head<=>p 
          	head->next=NULL;//当前结点指针域置为NULL,即head<=>p变为<-head<-p 
          	return p;//返回反转链首结点 
      	}
      };
      

你可能感兴趣的:(#,数据结构,算法,c++)