数据结构10

两两交换链表中的节点

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //交换节点并递归
    ListNode* swapPairs(ListNode* head) {
        if(!head||!head->next)return head;//边界条件
        //交换
        ListNode* temp = head->next;
        head->next=swapPairs(temp->next);
        temp->next=head;
        return temp;
    }
};

head->next=swapPairs(temp->next);
这里需要注意一下递归出现的位置

括号生成I

在这里插入图片描述

class Solution {
public:
    vector<string> result;
    void helper(string str,int left,int right){
        if(left)
            helper(str+'(',left-1,right);
        if(right>left)
            helper(str+')',left,right-1);
        if(!right)
            result.push_back(str);
    }
    vector<string> generateParenthesis(int n) {
        helper("",n,n);
        return result;
    }

};

2009 408应用题42题

已知一个带有表头结点的单链表,结点结构为:
在这里插入图片描述
假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。
要求:
(1)描述算法的基本设计思想。
(2)描述算法的详细实现步骤。
(3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或Java语言实现),关键之处请给出简要注释。

#include<stdio.h>
#include<stdlib.h>

typedef struct Node{
	int data;
	struct node *next;
}node,*LinkList;

void ShowList(LinkList L){//输出链表内容
	while(L){
		printf("%d->",L->data);
		L=L->next;
	}
	printf("NULL");
	printf("\n");
}

LinkList CreateList_end(int n){
	LinkList head = (LinkList)malloc(sizeof(node));
	node *p,*e;
	p=head;
	int x;
	for(int i=0;i<n;i++){
		//尾插法建立链表
		e=(LinkList)malloc(sizeof(node));
		scanf("%d",&x);
		e->data=x;
		p->next=e;
		p=e;
	}
	p->next=NULL;//将链表最后一个节点的指针域置空
	head=head->next;
	return head;
}
int LocateElement(LinkList list,int k){
LinkList p;
LinkList p1;
p1 = list->next;
p = list;
int i = 1;
	while(p1){
		p1 = p1->next;//快指针
		i++;
		if(i>k)
			p=p->next;//如果i>k,则p也往后移
			//慢指针
	}
	if(p==list)return 0;//p没有动,说明i<k,说明链表没有k个结点
	else{
		printf("%d\n",p->data);
		return 1;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值