链表操作

1 合并有序链表

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
          if(l1 == NULL)
              return l2;
          if(l2 == NULL)
              return l1;
          if(l1->val < l2->val){
              l1->next=mergeTwoLists(l1->next,l2);
              return l1;
          }
          else{
              l2->next=mergeTwoLists(l1,l2->next);
              return l2;
          }
}

2 反转链表

ListNode* reversal_List(ListNode* head){
   ListNode* p = head;
   ListNode* newp = NULL;
   if(head == NULL || head->next == NULL)
      return head;
   while(p!=NULL){
      ListNode* temp;
      temp = p->next;
      p->next = newp;
      newp = p;
      p = temp;
   }
   return newp;
}

3 判断链表是否为回文结构

https://blog.csdn.net/alxe_made/article/details/90730724
方法1:使用栈O(N)辅助空间

借助一个STL的stack将我们的value放到栈当中,然后对比的时候从栈顶弹出元素,如果有一个不相等则返回false,否则返回true

bool isHuiwenList(ListNode* head){
    stack<int> s;
    ListNode* curNode = head;
    while(curNode != NULL){
        s.push(curNode->val);
        curNode = curNode->next;
    }
    while(head!=NULL){
        if(head->val!=s.top())
            return false;
        else{
            head = head->next;
            s.pop();
        }
    }
    return true;
}

方法2:不使用辅助空间

快指针每次走两步,慢指针每次走一步。等到快指针遍历完链表,慢指针就正好停留在链表的中央。
将链表的后半部分进行反转。
将链表的前半部分与后半部分逐个比对。若都相同,则为回文链表,否则不是。
将反转之后右半部分的链表进行恢复.

bool isHuiwenList2(ListNode* head){
    if (head == NULL || head->next == NULL)
        return true;
    ListNode* n1 = head;//慢指针
    ListNode* n2 = head;//快指针
    while(n2->next!=NULL && n2->next->next!=NULL){
        n1 = n1->next;
        n2 = n2->next->next;
    }
    //反转后半部分,n1为要反转的头结点
    n2 = n1->next;
    n1->next = NULL;
    ListNode* temp = NULL;//辅助节点
    while(n2 != NULL){
        temp = n2->next;
        n2->next = n1;//反转之后的头节点为n1
        n1 = n2;
        n2 = temp;
    }
    temp = n1;//保存反转后的头结点,以便于后面恢复
    n2 = head;
    while(n1!=NULL && n2!=NULL){
        if(n1->val != n2->val)
            return false;
        else{
            n1 = n1->next;
            n2 = n2->next;
        }
    }
    //将刚才反转的链表恢复原样
    n1 = temp->next;//此处n1为辅助节点
    temp->next = NULL;
    while(n1!=NULL){
        n2 = n1->next;
        n1->next = temp;
        temp = n1;
        n1 = n2;
    }
    return true;
}

4 判断两个单向链表是否相交

1)方法1:
链表相交之后,后面的部分节点全部共用,可以用2个指针分别从这两个链表头部走到尾部,最后判断尾部指针的地址信息是否一样,若一样则代表链表相交!

2)方法2:
可以把其中一个链表的所有节点地址信息存到数组中,然后把另一个链表的每一个节点地址信息遍历数组,若相等,则跳出循环,说明链表相交。进一步优化则是进行hash排序,建立hash表。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值