链表

链表、头指针、头结点(经典)

头指针、头结点、第一个结点的区别与联系?

(1)头指针明显是一个指针,指向头结点
头节点的next指针指向第一个节点
第一个节点是一个节点,data变量存放第一个数据,next指针变量指向第二个节点

(2)头指针是指向头结点的指针
头结点是出于第一个结点之前的空结点
第一个结点就是出于第一个的结点(除头结点外)

(3)一个链表中,可以没有头结点,但是一定有头指针,头指针是对单链表的标识,
如果没有头结点,则头指针指向第一个结点

(4)设置头结点是为了保证处理第一个节点和后面的节点的时候设计的算法相同,实现程序的高效性。参照:链表设置头指针的作用是什么


  • 链表的反转
            1.链表无头结点
struct ListNode 
  {
       int val;
       struct ListNode *next;
       ListNode(int x) :
             val(x), next(NULL) { }
  };
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {              //牛客网的题目,传进来的是无头结点的链表,头指针指向第一个数据结点
        vector<int> vec;
        ListNode *cur,*beh,*pre;
        cur=head;                                                      //cur是当前操作的结点
        pre=NULL;                                                      //pre是原链表中当前结点的前结点
        
        while(cur)
        {
            beh=cur->next;                                              //beh是原链表中当前结点的后结点,先记录下来
            cur->next=pre;                                              //cur与beh断开
            pre=cur;                                                    //cur指向pre
            cur=beh;                                                    //当前结点后移
            
        }
       cur=pre;                                                         //cur指向为空时跳出循环,此时让其指向第一个结点
        while(cur)
        {
            vec.push_back(cur->val);
            cur=cur->next;
        }
         return vec;
       
    }
};
            2.链表有头结点

        ListNode *cur,*beh,*pre;
        cur=head->next;                                                //cur是当前操作的结点
        pre=NULL;                                                      //pre是原链表中当前结点的前结点
        head->next=NULL;                                               //头结点先断开,成单个结点
     
        while(cur)
        {
            beh=cur->next;                                              //beh是原链表中当前结点的后结点,先记录下来
            cur->next=pre;                                              //cur与beh断开
            pre=cur;                                                    //cur指向pre
            cur=beh;                                                    //当前结点后移
        }    
        
       head->next=pre;                                                   //头结点和数据结点连起来,新链表的头指针仍为head

            3.链表无头结点,将链表逆序存入到vector中

        vector<int> vec;
        while(head)
        {
            vec.push_back(head->val);
            head=head->next;
        }
        reverse(vec.begin(),vec.end());                   //vector反转函数
        return vec;
/*************************************************************************以上是 "链表反转" 的非 “递归” 操作******************************************************************************/
              1.链表反转的递归操作(无头结点)

      node* In_reverseList(node* H)
{
    if (H == NULL || H->next == NULL)       //链表为空直接返回,而H->next为空是递归基
        return H;
    node* newHead = In_reverseList(H->next);  //一直循环到链尾 
    H->next->next = H;                        //翻转链表的指向,递归首次返回的操作位置。
                                           //若链表为1,2,3,4,5。当前结点H为4,本行让尾结点5指向4
    H->next = NULL;                        //记得赋值NULL,防止链表错乱
    return newHead;                        //新链表头永远指向的是原链表的链尾
}  

递归可参照:

链表参考:链表、头指针、头结点(经典)

C++递归算法:我的理解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值