您的位置:首页 > 其它

LeetCode-206&92.Reverse Linked List

2016-04-10 22:21 399 查看
206 https://leetcode.com/problems/reverse-linked-list/

Reverse a singly linked list.

/**
* Definition for singly-linked list.
* public class ListNode {
*     public int val;
*     public ListNode next;
*     public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
return head;
ListNode pre=null, next;
while (head != null)
{
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
递归

public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
return head;
ListNode next = head.next;
head.next = null;
ListNode node = ReverseList(next);
next.next = head;
return node;
}


92 https://leetcode.com/problems/reverse-linked-list-ii/

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:

Given 
1->2->3->4->5->NULL
, m = 2 and n = 4,

return 
1->4->3->2->5->NULL
.

Note:

Given m, n satisfy the following condition:

1 ≤ m ≤ n ≤ length of list.

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     public int val;

 *     public ListNode next;

 *     public ListNode(int x) { val = x; }

 * }

 */
使用栈:(低效)

public ListNode ReverseBetween(ListNode head, int m, int n)
{
if(head.next==null||m==n)
return head;

ListNode pre = new ListNode(0);
pre.next = head;
ListNode curNode = pre;
Stack<ListNode> stack = new Stack<ListNode>();
for (int i = 0; i < m; i++)
{
curNode = curNode.next;
}
for (int i = m; i <= n; i++)
{
stack.Push(curNode);
curNode = curNode.next;
}
ListNode leftNode = curNode;
curNode = pre;
for (int i = 0; i < m - 1; i++)
{
curNode = curNode.next;
}

while (stack.Count!=0)
{
curNode.next = stack.Pop();
curNode = curNode.next;
}
curNode.next = leftNode;
return pre.next;
}


不用栈
public ListNode ReverseBetween(ListNode head, int m, int n)
{
if (head.next == null || m == n)
return head;

ListNode pre = new ListNode(0);
pre.next = head;
ListNode curNode = pre;
for (int i = 0; i < m - 1; i++)
{
curNode = curNode.next;
}
ListNode first = curNode.next;
ListNode next = first.next;
for (int i = m; i < n; i++)
{
first.next = next.next;
next.next = curNode.next;
curNode.next = next;
next = first.next;
}
return pre.next;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 leetcode