2020-09-12

9 篇文章 0 订阅
3 篇文章 0 订阅

链表

1 反转链表

核心思想

1.生成一个新节点 ListNode* pre = NULL
2.记录当前节点的逆转前的下一个节点 ListNode* next = head->next;
3.让下一个节点指向当前上一个节点(第一个节点指向空) head->next=pre
4.一直遍历到最后一个节点 pre = head; head = next;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *pre = NULL;
        while(head){
            ListNode* next = head->next;
            head->next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
};

2 反转链表 b(逆置 m-n的代码)

#include<stdio.h>

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



class Solution{
	public:
		ListNode* reverse_b(ListNode *head,int m,int n){
			if(m<1 && m>n){
				printf("error data\n");  
			}
			
			int change_len = n-m+1;		//需要逆置的结点个数 
			ListNode *pre_head = NULL;	//初始化开始逆置的结点的前驱
			ListNode *result = head;	//最终转换后的链表头结点,非特殊情况即为head
			while(head && --m){			//将head向前移动m-1个位置,注意如果m=1,pre_head还是为NULL,while循环不执行 
				pre_head = head;		//记录head的前驱 
				head = head->next; 	
			} 
			
			ListNode *modify_list_tail = head;		//将modify_list_tail指向当前的head,即逆置段逆置后的链表尾 
			
			ListNode *new_head = NULL; 
			while(head && change_len){				//逆置change_len个结点 
				ListNode *next = head->next;
				head->next = new_head;
				new_head = head;
				head = next; 
				change_len--;						//每完成一个结点逆置,change_len-- 
			}
			
			modify_list_tail->next = head;			//连接逆置后链表尾 与 逆置段的后一个结点 
			if(pre_head){							//如果pre_head不空,说明不是从第一个结点开始逆置的m>1, 就是逆置段不包括头结点result的情况
				pre_head->next = new_head;			//将逆置链表开始的结点前驱与逆置后的头结点连接  
			} 
			else{									//如果逆置段包括了头结点,头结点元素成了逆置段 逆置后的尾元素 
				result = new_head;					//result为逆置前链表头结点的位置,如果pre_head为空,说明 m==1,
													//从链表第一个结点开始逆置,链表头结点变为逆置段逆置后的尾结点,逆置前逆置段的尾结点成了逆置后整个链表头结点 
			} 
			return result; 							
		} 
}; 

int main(){
	ListNode a(1);
	ListNode b(2);
	ListNode c(3);
	ListNode d(4);
	ListNode e(5);
	
	a.next = &b;
	b.next = &c;
	c.next = &d;
	d.next = &e;
	
	Solution solve;
	ListNode *head = &a;
	printf("Before reverse: \n");
	
	while(head){
		printf("%d\n",head->val);
		head = head->next;
	}
	
	printf("Please Input m and n:\n");
	int m,n;
	scanf("%d%d",&m,&n);
	head = solve.reverse_b(&a,m,n);
	printf("After reverse:\n");
	while(head){
		printf("%d\n",head->val);
		head = head->next;
	}		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值