从尾到头打印链表 ,合并两个排序的链表、反转链表 :迭代法

 

目录

 

合并两个排序的链表:

关于迭代法的理解: 

每一层函数功能:

迭代的两个问题:

往里走时:

出来时:

 从尾到头打印链表 返回数组;

每一层函数功能:

迭代的两个问题:

往里走时:

出来时:

反转链表 

每一层函数功能:

迭代的两个问题:

往里走时:

出来时:


合并两个排序的链表:

关于迭代法的理解: 

每一层函数功能:

两个结点比较,返回较小结点

迭代的两个问题:

往里走时

        下一步的递归区间:因为是从小到大排序,所以当p1<= p2时,下一步应该比较p1->next和p2;

出来时

        返回值是什么:最后出来时,最后一层肯定是直接返回的头节点,每一层也应该返回头结点,从小到达排序,因此当p1<= p2时,返回较小的头节点p1;

        怎么处理:因为是从小到大,当p1<= p2时,因此出来时的头链接是p1->next = 返回值;

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        //终止条件;
		if(!pHead1) return pHead2;
		if(!pHead2) return pHead1;
		//
		//函数功能:两个结点比较,返回较小结点
		//开始迭代的两个问题:
		//往里走时:下一步的递归区间:因为是从小到大排序,所以当p1<= p2时,下一步比较p1->next和p2;
		//出来时:返回值是什么,怎么处理;最后出来时,最后一层肯定是直接返回的头节点,因为是从小到大,因此出来时首先建立连接p1->p2;
		if(pHead1->val <= pHead2->val){
			pHead1->next = Merge(pHead1->next, pHead2);
			return pHead1;
		}else{
			pHead2->next = Merge(pHead1, pHead2->next);
			return pHead2;
		}
    }
};

 从尾到头打印链表 返回数组;

每一层函数功能:

先走到底,返回时将结点值放入容器;

迭代的两个问题:

往里走时

        终止条件:head = NULL;

出来时

        返回值是什么:使用& ,因此不需要返回值;

        怎么处理:将结点值依次放入vector容器中;

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
  public:
  //这里使用&来传递,
   void reverseList(ListNode* head, vector<int>& v) {
        if(head != NULL){
            reverseList(head->next, v);
            v.push_back(head->val);
        }
    }
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> v;
        reverseList(head, v);
        return v;
    }
};

反转链表 

每一层函数功能:

先走到底,返回时将结点值放入容器;

迭代的两个问题:

往里走时

        终止条件:最后一个结点;即head.next = NULL;

出来时

        返回值是什么:最后一个结点,存着当头节点;

        怎么处理:反转指向,之后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 || pHead->next == NULL)
            return pHead;
		//
        ListNode* ret = ReverseList(pHead->next);
		
        pHead->next->next = pHead;
        pHead->next = NULL;
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值