题目描述
输入一个链表,反转链表后,输出新链表的表头。
注意:这个链表有效值是从head开始而不是head->next开始的
下面的代码没有动指针只是改值了,不是很推荐,但是通过了测试,有时间再写动指针的方法吧
c++代码如下:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* head) { ListNode *p=head; int top=0; vector<int> res; if(p==NULL) return NULL; while(p) { res.push_back(p->val); p=p->next; }reverse(res.begin(),res.end()); p=head; while(p){ p->val=res[top]; top++;p=p->next; } return head; } };
用栈:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int[] reversePrint(ListNode head) { Stack<Integer> stk = new Stack<>(); ListNode temp = head; while(temp!=null){ stk.add(temp.val); temp=temp.next; } int size=stk.size(); int []res = new int[size]; for(int i=0;i<size;i++){ res[i]=stk.pop(); } return res; } }

不用栈
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int[] reversePrint(ListNode head) { ListNode temp = head; int size=0; while(temp!=null){ size++; temp = temp.next; } int top=size-1; int []res = new int [size]; temp=head; while(temp!=null){ res[top--]=temp.val; temp=temp.next; } return res; } }

操作指针(更建议这种解法:双指针)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null) return null;
ListNode pre=head,cur=pre.next,tmp;
pre.next=null;
while(cur!=null){
tmp=cur.next;//cur未指向pre时先保存它的next节点
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
}
