赞
踩
在学习数据结构的过程中,学习到链表这一块,为了加深印象,自己从leetcode上发现了比较经典的题目如下:
(这里prev是你要指向的结点,curr为当前结点)
可以看到,我们先从第一个结点出发,其指针域prev要指向null,这里假设node1为当前结点curr,所以要curr.pnext=prev,但在做这一步之前,我们要先保存一下curr.pnext,也就是
ListNode next=curr.pnext,好了,第一个结点反转完毕,接着下一个,当前结点变为node2,故,prev=curr;curr=next;依次循环下去。
#include<stdio.h> #include<stdlib.h> typedef struct ListNode{ int val; struct ListNode *pnext; }ListNode; ListNode *ReverseList(ListNode*head){ ListNode *prev = NULL; ListNode *curr = head; while (curr) { ListNode *next = curr->pnext; curr->pnext=prev; prev=curr; curr=next; } return prev; } void display(ListNode *head){ ListNode* temp=head; while (temp) { printf("%d ",temp->val); temp=temp->pnext; } } int main(void){ ListNode *p1=(ListNode*)malloc(sizeof(ListNode)); ListNode *p2=(ListNode*)malloc(sizeof(ListNode)); ListNode *p3=(ListNode*)malloc(sizeof(ListNode)); p1->val=1; p1->pnext=p2; p2->val=2; p2->pnext=p3; p3->val=3; p3->pnext=NULL; printf("初始链表为:\n"); display(p1); ListNode *pp=ReverseList(p1); printf("\n"); printf("反转后链表为:\n"); display(pp); free(p1); free(p2); free(p3); return 0; }
package node; class ListNode{ int val; ListNode pnext; ListNode(int val, ListNode pnext){ this.val=val; this.pnext=pnext; } static void display(ListNode head){ ListNode temp=head; while(temp!=null){ System.out.print(temp.val+" "); temp=temp.pnext; } System.out.println(); } public static ListNode ReverseList(ListNode head) { ListNode prev=null; ListNode curr=head; while(curr!=null){ ListNode next=curr.pnext; curr.pnext=prev; prev=curr; curr=next; } return prev; } } public class Node { public static void main(String args[]){ ListNode node3=new ListNode(3,null); ListNode node2=new ListNode(2,node3); ListNode node1=new ListNode(1,node2); System.out.println("初始化链表为:"); ListNode.display(node1); System.out.println("反转后链表为:"); ListNode reverse=ListNode.ReverseList(node1); ListNode.display(reverse); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。