链表逆转

yoxibaga 2014-10-10 03:36:49
给定一个数v,对于链表1-2-3-4-5-6
v=2,逆转后的链表为2-1-4-3-6-5
v=3,逆转后的链表为3-2-1-6-5-4
v=4,逆转后的链表为4-3-2-1-6-5
...全文
581 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
一根烂笔头 2014-12-08
  • 打赏
  • 举报
回复

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

struct list_node {
	int data;
	struct list_node *next;
};

//嵌套循环,分段逆序,O(n)
void reverse_list(struct list_node *head, int n)
{
	int i;
	struct list_node *curr, *p, *tail;

	p = head->next; //head指向头结点
	curr = tail = p;
	while(curr) {
		curr = curr->next;
		for(i = 1; i < n && curr; ++i) { //头插入法逆序
			head->next = curr;
			curr = curr->next;
			head->next->next = p;
			p = head->next; 
		}
		tail->next = curr;
		head = tail;
		tail = p = curr;
	}
}

void test(void)
{
	int data[] = {1, 2, 3, 4, 5, 6, 0};
	int *p = data;
	struct list_node head, *curr;
	int i;

	curr = &head;

	while(*p) {
		curr->next = malloc(sizeof(struct list_node));
		if(!curr->next)
			exit(-1);
		curr = curr->next;
		curr->data = *p++;
	}

	for(i = 1; i < 7; ++i) { 
		printf("v = %d\n", i);
		reverse_list(&head, i); //前一次执行结果作为第二次执行的输入 

		curr = head.next;
		while(curr) {
			printf("%d ", curr->data);
			curr = curr->next;
		}
		printf("\n");
	}

	while(head.next) {
		curr = head.next;
		head.next = curr->next;
		free(curr);
	}
}

int main(int argc, char *argv[])
{
	test();
	return 0;
}
运行结果 v = 1 1 2 3 4 5 6 v = 2 2 1 4 3 6 5 v = 3 4 1 2 5 6 3 v = 4 5 2 1 4 3 6 v = 5 3 4 1 2 5 6 v = 6 6 5 2 1 4 3 注:前次输出是后辞的输入
欢乐的小猪 2014-12-03
  • 打赏
  • 举报
回复
单链表就地逆转 原序列:头结点 结点1 结点2 结点3 结点4 结点5 结点6 v=3时 记录下头结点 结点1 (记录结点p,结点q 操作:p->next=q->next,q->next=q->next->next,p->next->next=q) 头结点 结点1 结点2 结点3 结点4 结点5 结点6 头结点 结点2 结点1 结点3 结点4 结点5 结点6 头结点 结点3 结点2 结点1 结点4 结点5 结点6 记录下结点1 结点4 头结点 结点3 结点2 结点1 结点4 结点5 结点6 头结点 结点3 结点2 结点1 结点5 结点4 结点6 头结点 结点3 结点2 结点1 结点6 结点5 结点4
li_x1979 2014-10-21
  • 打赏
  • 举报
回复
把链表做成循环的,然后定义表头和遍历方向就可以了。
s_wenze 2014-10-11
  • 打赏
  • 举报
回复

void backward(int v,pNode pHead){
    Node *p = pHead->pNext;
    Node *beforeP = pHead;
    Node *q;
    int count = v-1;
    while(p->pNext != NULL){
        q = p->pNext;
       //经过v周期后初始化
        if(count == 0){
            beforeP = p;
            p = q;
            q = q->pNext;
            count = v-1;
        }
        //逆序
        p->pNext = q->pNext;
        q->pNext = beforeP->pNext;
        beforeP->pNext = q;
        count--;
    }
}
dbhme 2014-10-11
  • 打赏
  • 举报
回复
就地逆转需要多几个临时变量而已
yoxibaga 2014-10-10
  • 打赏
  • 举报
回复
引用 楼主 yoxibaga 的回复:
给定一个数v,对于链表1-2-3-4-5-6 v=2,逆转后的链表为2-1-4-3-6-5 v=3,逆转后的链表为3-2-1-6-5-4 v=4,逆转后的链表为4-3-2-1-6-5
恩,这样可以。就地逆转呢?
可乐崽 2014-10-10
  • 打赏
  • 举报
回复
一、以V为长度先把原链表截成N个子链表/数组 二、convert每一个子链表 三、重新合成新的链表

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧